@libs-ui/components-draw-line 0.2.159 → 0.2.161
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ChangeDetectorRef, NgZone, ElementRef, EventEmitter,
|
|
2
|
+
import { inject, ChangeDetectorRef, NgZone, ElementRef, EventEmitter, Output, Input, Directive } from '@angular/core';
|
|
3
3
|
import { range, cloneDeep, checkMouseOverInContainer, get, getDragEventByElement } from '@libs-ui/utils';
|
|
4
4
|
import { Subject, takeUntil, tap } from 'rxjs';
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-draw-line.mjs","sources":["../../../../../libs-ui/components/draw-line/src/util/calculator-branch.util.ts","../../../../../libs-ui/components/draw-line/src/util/calculator-diretion-element.until.ts","../../../../../libs-ui/components/draw-line/src/util/line-connect-bottom-left.until.ts","../../../../../libs-ui/components/draw-line/src/util/connect-navigation-new-element.util.ts","../../../../../libs-ui/components/draw-line/src/draw-line.directive.ts","../../../../../libs-ui/components/draw-line/src/libs-ui-components-draw-line.ts"],"sourcesContent":["\nexport class MoCanvasCalculatorBranchUtil {\n /**\n * \n * above, left a + b; opposite = true a - b;\n * \n * under, right a - b; opposite = true a + b\n */\n static mathOperatorsCalculation(direction: 'left' | 'right' | 'above' | 'under' | string, a: number | undefined, b: number | undefined, opposite?: boolean) {\n switch (direction) {\n case 'left':\n case 'above':\n if (opposite) {\n return (a ?? 0) - (b ?? 0);\n }\n\n return (a ?? 0) + (b ?? 0);\n\n case 'right':\n case 'under':\n if (opposite) {\n return (a ?? 0) + (b ?? 0);\n }\n\n return (a ?? 0) - (b ?? 0);\n default:\n return (a ?? 0) - (b ?? 0);\n }\n }\n}","import { range } from \"@libs-ui/utils\";\nimport { ICoordinatesSvg, IPoint, IPoints, IRect } from \"../draw-line.interface\";\nimport { MoCanvasCalculatorBranchUtil } from \"./calculator-branch.util\";\nimport { MoCanvasConnectNavigationNewElementUtil } from \"./connect-navigation-new-element.util\";\n\nexport interface IPositionXY { x: number, y: number }\nexport type CornerDirection = 'right-under' | 'under-left' | 'left-above' | 'above-right' | 'under-right' | 'right-above' | 'above-left' | 'left-under'; // theo chiều\nexport class MoCanvasCalculatorDirectionElementUtil {\n static checkUpDownLeftRight(firstPoint: number | undefined, endPoint: number | undefined, direction: 'x' | 'y'): string {\n const distance = ((firstPoint ?? 0) - (endPoint ?? 0));\n\n if (distance === 0) {\n return 'center';\n }\n if (distance > 0) {\n return direction === 'x' ? 'left' : 'above';\n }\n\n return direction === 'x' ? 'right' : 'under';\n }\n\n static drawLineQ(start: { x: number, y: number }, corner: CornerDirection | string, lineCurveX: number, lineCurveY: number) {\n\n const coordQ: ICoordinatesSvg = {};\n\n switch (corner) {\n case 'right-under':\n coordQ.x1 = start.x + lineCurveX;\n coordQ.y1 = start.y;\n coordQ.x = coordQ.x1;\n coordQ.y = coordQ.y1 + lineCurveY;\n break;\n\n case 'under-left':\n coordQ.x1 = start.x;\n coordQ.y1 = start.y + lineCurveY;\n coordQ.x = coordQ.x1 - lineCurveX;\n coordQ.y = coordQ.y1;\n break;\n\n case 'left-above':\n coordQ.x1 = start.x - lineCurveX;\n coordQ.y1 = start.y;\n coordQ.x = coordQ.x1;\n coordQ.y = coordQ.y1 - lineCurveY;\n break;\n\n case 'above-right':\n coordQ.x1 = start.x;\n coordQ.y1 = start.y - lineCurveY;\n coordQ.x = coordQ.x1 + lineCurveX;\n coordQ.y = coordQ.y1;\n break;\n\n case 'under-right':\n coordQ.x1 = start.x;\n coordQ.y1 = start.y + lineCurveY;\n coordQ.x = coordQ.x1 + lineCurveX;\n coordQ.y = coordQ.y1;\n break;\n\n case 'right-above':\n coordQ.x1 = start.x + lineCurveX;\n coordQ.y1 = start.y;\n coordQ.x = coordQ.x1;\n coordQ.y = coordQ.y1 - lineCurveY;\n break;\n\n case 'above-left':\n coordQ.x1 = start.x;\n coordQ.y1 = start.y - lineCurveY;\n coordQ.x = coordQ.x1 - lineCurveX;\n coordQ.y = coordQ.y1;\n break;\n\n case 'left-under':\n coordQ.x1 = start.x - lineCurveX;\n coordQ.y1 = start.y;\n coordQ.x = coordQ.x1;\n coordQ.y = coordQ.y1 + lineCurveY;\n break;\n\n default:\n break;\n }\n\n return coordQ;\n }\n\n /**Tránh khối phía bên phải */\n static byPassElementOnRightSide(startX: number, startY: number, endY: number, lineCurve: number, elementBlockRoad: IRect, directionX: string, separatedPoints: Array<IPoints>, key?: string, coordLX?: number) {\n const topElementBlockRoad = (elementBlockRoad.y ?? 0);\n const bottomElementBlockRoad = (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0);\n const directionY = this.checkUpDownLeftRight(startY, endY, 'y');\n const Q1 = this.drawLineQ({ x: startX, y: startY ?? 0 }, `${directionX}-${directionY === 'under' ? 'under' : 'above'}`, lineCurve, lineCurve);\n const L1 = {\n x: Q1.x ?? 0,\n y: (directionY === 'under' ? bottomElementBlockRoad : topElementBlockRoad)\n };\n\n if (MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {\n if ((directionY === 'under' && bottomElementBlockRoad - (Q1.y ?? 0) <= 0)\n || (directionY === 'above' && topElementBlockRoad - (Q1.y ?? 0) >= 0)) {\n L1.y = Q1.y ?? 0;\n }\n\n if (Math.abs((L1.y ?? 0) - endY) <= 10) {\n L1.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, L1.y, lineCurve);\n }\n }\n const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionY === 'under' ? 'under' : 'above'}-${directionX}`, lineCurve, lineCurve);\n\n const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;\n const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;\n\n separatedPoints.push({ start: { x: coordLX ?? startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'horizontal-single-curve', id: key, name: 'qr' });\n separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y }, mode: 'horizontal', id: key, name: 'lr' });\n separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'vertical-single-curve', id: key, name: 'q2r' });\n\n return {\n pathByPassQ: `${pathQ1} ${pathQ2}`,\n endPath: {\n x: Q2.x ?? 0,\n y: Q2.y ?? 0\n }\n };\n }\n\n /**Tránh khối phía bên trên */\n static byPassElementOnTopBottomSide(startX: number, startY: number, endX: number, lineCurve: number, elementBlockRoad: IRect, directionY: string, separatedPoints: Array<IPoints>, key?: string) {\n const leftElementBlockRoad = (elementBlockRoad.x ?? 0);\n const rightElementBlockRoad = (elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0);\n const directionX = this.checkUpDownLeftRight(startX, endX, 'x') === 'left' ? 'left' : 'right'; // xem nên tránh sang trái hay phải\n\n const Q1 = this.drawLineQ({ x: startX, y: startY ?? 0 }, `${directionY}-${directionX}`, lineCurve, lineCurve);\n const L1 = {\n x: (directionX === 'left' ? leftElementBlockRoad : rightElementBlockRoad),\n y: Q1.y ?? 0\n };\n\n if ((directionX === 'right' && rightElementBlockRoad - (Q1.x ?? 0) <= 0) || (directionX === 'left' && leftElementBlockRoad - (Q1.x ?? 0) >= 0)) {\n L1.x = Q1.x ?? 0;\n }\n const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionX}-${directionY}`, lineCurve, lineCurve);\n\n if (Math.abs((Q2.x ?? 0) - leftElementBlockRoad) <= 10) {\n Q2.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, Q2.x, lineCurve, true);\n }\n\n const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;\n const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'vertical-single-curve', id: key ?? 'qb' });\n separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y ?? 0 }, mode: 'horizontal-single-curve', id: key ?? 'lb' });\n separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y ?? 0 }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'horizontal-single-curve', id: key ?? 'q2b' });\n\n return {\n pathByPassQ: `${pathQ1} ${pathQ2}`,\n endPath: {\n x: Q2.x ?? 0,\n y: Q2.y ?? 0\n }\n };\n }\n\n // kiểm tra đường thẳng và khối có cắt nhau không\n static checkLinePassBlockHorizontal(start: number, end: number, xOrYOfLine: number, direction: 'x' | 'y', obstacleRect: IRect[], returnAllElementBlockRoad?: boolean) {\n const minimumDistanceFromBlock = 8;\n\n start += minimumDistanceFromBlock + 1; // tránh khối xuất phát vào list\n const listPointsOfLine = range(start, end + 1);\n\n const elementBlockRoad = obstacleRect.filter(item => {\n const left = (item.x ?? 0) - minimumDistanceFromBlock;\n const right = (item.x ?? 0) + (item.width ?? 0) + minimumDistanceFromBlock;\n const top = (item.y ?? 0) - minimumDistanceFromBlock;\n const bottom = (item.y ?? 0) + (item.height ?? 0) + minimumDistanceFromBlock;\n\n if (direction === 'x' && listPointsOfLine.find(el => (left <= el && el <= right)) && (top <= xOrYOfLine && xOrYOfLine <= bottom)) {\n return true;\n }\n if (direction === 'y' && listPointsOfLine.find(el => (top <= el && el <= bottom)) && (left <= xOrYOfLine && xOrYOfLine <= right)) {\n return true;\n }\n\n return false;\n });\n\n if (!elementBlockRoad || !elementBlockRoad.length) {\n return undefined;\n }\n\n if (returnAllElementBlockRoad) {\n return elementBlockRoad;\n }\n\n if (direction === 'y') {\n return elementBlockRoad.reduce((a: IRect, b: IRect) => (Math.abs(((a.y ?? 0) - start))) < (Math.abs(((b.y ?? 0) - start))) ? a : b);\n }\n\n return elementBlockRoad.reduce((a: IRect, b: IRect) => (Math.abs(((a.x ?? 0) - start))) < (Math.abs(((b.x ?? 0) - start))) ? a : b);\n }\n\n // kiểm tra hướng thẳng vẽ về điểm end xem có bị chắn bởi khối nào không, nếu có thì phải lùi lại điểm end nhé.\n static checkBlocksElementStraightY(startX: number, startY: number, endPosition: { x: number, y: number }, obstacleRect: IRect[]) {\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect, true) as IRect[];\n\n if (!elementBlockRoad || !elementBlockRoad.length) {\n return;\n }\n\n return elementBlockRoad.reduce((a: IRect, b: IRect) => (Math.abs((a.x ?? 0 - startX))) < (Math.abs((b.x ?? 0 - startX))) ? a : b);\n }\n\n // kiểm tra hướng ngang vẽ về điểm end xem có bị chắn bởi khối nào không, nếu có thì phải lùi lại điểm end nhé.\n static checkBlocksElementX(startX: number, startY: number, endPosition: { x: number, y: number }, obstacleRect: IRect[]) {\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect, true) as IRect[];\n\n if (!elementBlockRoad || !elementBlockRoad.length) {\n return;\n }\n\n return elementBlockRoad.reduce((a: IRect, b: IRect) => (Math.abs(((a.y ?? 0) - startY))) < (Math.abs(((b.y ?? 0) - startY))) ? a : b);\n }\n\n // kiểm tra hướng sang phải là tránh khối\n static checkAndAvoidBlocksLeft(startX: number, startY: number, lineCurve: number, endPosition: IPositionXY, obstacleRect: IRect[], separatedPoints: Array<IPoints>): IPoint {\n const coordLX: IPoint = { x: endPosition.x, y: startY };\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect) as IRect;\n\n if (!elementBlockRoad) {\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '14' });\n\n return coordLX;\n }\n\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');\n const specificXElement = directionX === 'right' ? (elementBlockRoad.x ?? 0) : ((elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0));\n\n coordLX.x = specificXElement + (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) + (lineCurve / 2);\n if (directionX === 'right') {\n coordLX.x = specificXElement - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);\n }\n\n let startXBypassElement = coordLX.x;\n\n if ((directionX === 'left' && startX - (coordLX.x ?? 0) <= 0) || (directionX === 'right' && startX - (coordLX.x ?? 0) >= 0)) {\n coordLX.x = startX;\n startXBypassElement = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, coordLX.x, lineCurve);\n }\n\n let lineByPassBlock: IPoints[] = [];\n let { endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, lineByPassBlock, undefined, coordLX.x);\n\n if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-left' && elementBlockRoad.x + (elementBlockRoad.width) / 2 === endPosition.x && Math.abs(endPosition.y - elementBlockRoad.y) <= 20) { // check xem khối chắn có phải là khối đích hay không?\n lineByPassBlock = [];\n const data = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSideNewMode(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineByPassBlock, undefined, coordLX.x);\n\n endPath = data.endPath;\n }\n separatedPoints.push(...lineByPassBlock);\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '15' });\n const dataEndPath = this.checkAndAvoidBlocksLeft(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);\n\n return dataEndPath;\n }\n\n // kiểm tra hướng sang phải là tránh khối\n static checkAndAvoidBlocks(startX: number, startY: number, lineCurve: number, endPosition: { x: number, y: number }, obstacleRect: IRect[], separatedPoints: Array<IPoints>, pathPre?: string): { path: string, endPath: IPoint } {\n const coordLX: IPoint = { x: endPosition.x - 30, y: startY };\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect) as IRect;\n\n if (!elementBlockRoad) {\n const elementBlockRoadStraightLineY = this.checkBlocksElementStraightY((coordLX.x ?? 0) + 10, coordLX.y ?? 0, endPosition, obstacleRect); // tính điểm end_x dự kiến theo trường hợp đẹp nhất xem nó có chắn bởi khối nào khi kéo xuống không\n\n if (elementBlockRoadStraightLineY && (elementBlockRoadStraightLineY.x ?? 0) > startX) {\n let toX = (elementBlockRoadStraightLineY.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);\n\n if (((elementBlockRoadStraightLineY?.x ?? 0) - startX) < MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT) {\n toX = (elementBlockRoadStraightLineY.x ?? 0) - (((elementBlockRoadStraightLineY?.x ?? 0) - startX) / 2);\n }\n coordLX.x = toX;\n }\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'end' });\n\n return {\n path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,\n endPath: coordLX\n };\n }\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');\n\n coordLX.x = (elementBlockRoad.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);\n\n let separatedPointsByPassElementOnRightSide: Array<IPoints> = [];\n\n const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(coordLX.x, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, separatedPointsByPassElementOnRightSide, 'checkAndAvoidBlocks', coordLX.x);\n let line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;\n\n // tính trước trường hợp sau để lùi line\n const elementBlockRoadPre = this.checkLinePassBlockHorizontal(endPath.x ?? 0, endPosition.x, endPath.y ?? 0, 'x', obstacleRect) as IRect;\n\n if (!elementBlockRoadPre) {\n const elementBlockRoadStraightLineY = this.checkBlocksElementStraightY((endPosition.x ?? 0) + 10, endPath.y ?? 0, endPosition, obstacleRect);\n\n if (elementBlockRoadStraightLineY) {\n const XNew = (elementBlockRoadStraightLineY.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);\n\n if (XNew < (endPath.x ?? 0)) {\n separatedPointsByPassElementOnRightSide = [];\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'u' });\n\n line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`;\n\n return {\n path: line,\n endPath: coordLX\n };\n }\n }\n }\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsByPassElementOnRightSide);\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'p' });\n const data = this.checkAndAvoidBlocks(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints, `${line}`,);\n\n return {\n path: data.path,\n endPath: data.endPath\n };\n }\n\n // kiểm tra hướng thẳng và tránh khối\n static checkAndAvoidBlocksY(startX: number, startY: number, lineCurve: number, endPosition: { x: number, y: number }, directionY: string, obstacleRect: IRect[], separatedPoints: Array<IPoints>, pathPre?: string): { path: string, endPath: IPoint } {\n const coordLX: IPoint = { x: startX, y: endPosition.y };\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect) as IRect;\n\n if ((directionY === 'under' && startY > endPosition.y) || (directionY === 'above' && startY < endPosition.y)) {\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'k' });\n\n return {\n path: pathPre ?? '',\n endPath: { x: startX, y: startY }\n };\n }\n if (!elementBlockRoad) {\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'r' });\n\n return {\n path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,\n endPath: coordLX\n };\n }\n\n const y = directionY === 'above' ? (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0) : (elementBlockRoad.y ?? 0);\n\n coordLX.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, y, lineCurve * 2);\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'ra' });\n const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnTopBottomSide(coordLX.x ?? 0, coordLX.y ?? 0, endPosition.x, lineCurve, elementBlockRoad, directionY, separatedPoints);\n\n // sau khi đã tránh thì tiếp tục kéo dài cho tời điểm end x, lại kiểm tra xem có khối nào chắn không?\n const line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;\n const data = this.checkAndAvoidBlocksY(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, `${line}`);\n\n return {\n path: data.path,\n endPath: data.endPath\n };\n }\n\n // kiểm tra hướng thẳng và tránh khối\n static checkAndAvoidBlocksYLeft(startX: number, startY: number, lineCurve: number, endPosition: IPositionXY, directionY: string, obstacleRect: IRect[], separatedPoints: Array<IPoints>, pathPre?: string): { path: string, endPath: IPositionXY } {\n const key = 'checkAndAvoidBlocksYLeft';\n\n const coordLX: IPositionXY = { x: startX, y: endPosition.y };\n const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect) as IRect;\n\n if (!elementBlockRoad) {\n const elementBlockRoadStraightLineX = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementX(coordLX.x ?? 0, (coordLX.y ?? 0), endPosition, obstacleRect);\n\n if (elementBlockRoadStraightLineX) {\n const topElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0);\n const bottomElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0) + (elementBlockRoadStraightLineX.height ?? 0);\n\n let toY = (directionY === 'under' ? topElementBlockRoad : bottomElementBlockRoad);\n\n toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, toY, lineCurve * 2);\n\n if (toY > startY && MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {\n coordLX.y = toY;\n }\n }\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: key, name: 'a' });\n\n return {\n path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,\n endPath: coordLX\n };\n }\n\n const y = directionY === 'above' ? (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0) : (elementBlockRoad.y ?? 0);\n const elementBlockRoadStraightLineX = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementX(coordLX.x ?? 0, (coordLX.y ?? 0), endPosition, obstacleRect);\n let ignoreBypassElement = false;\n\n if (elementBlockRoadStraightLineX && elementBlockRoadStraightLineX.id === elementBlockRoad.id) {\n ignoreBypassElement = true;\n }\n coordLX.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, y, lineCurve * 2);\n\n let separatedPointsByPassElementOnRightSide: Array<IPoints> = [];\n\n const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnTopBottomSide(coordLX.x ?? 0, coordLX.y ?? 0, endPosition.x, lineCurve, elementBlockRoad, directionY, separatedPointsByPassElementOnRightSide, key);\n let end = coordLX;\n let line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`;\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: key, name: 'b' });\n\n if (ignoreBypassElement) {\n separatedPointsByPassElementOnRightSide = [];\n separatedPoints.push({ start: coordLX, end, mode: 'horizontal', id: key, name: 'c' });\n\n return {\n path: line,\n endPath: end\n };\n }\n\n end = endPath;\n line += ` ${pathByPassQ}`;\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsByPassElementOnRightSide);\n const data = this.checkAndAvoidBlocksYLeft(end.x ?? 0, end.y ?? 0, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, `${line}`);\n\n return {\n path: data.path,\n endPath: data.endPath\n };\n }\n\n static byPassElementOnRightSideNewMode(startX: number, startY: number, endY: number, separatedPoints: Array<IPoints>, key?: string, coordLX?: number) {\n const start = { x: coordLX ?? startX, y: startY };\n const end = { x: (start.x ?? 0) - 20, y: endY };\n\n separatedPoints.push({ start: start, end: end, mode: 'horizontal', id: key, name: 'q2r' });\n\n return {\n pathByPassQ: ``,\n endPath: end\n };\n }\n}","import { cloneDeep } from \"@libs-ui/utils\";\nimport { IPoint, IPoints, IRect } from \"../draw-line.interface\";\nimport { MoCanvasCalculatorBranchUtil } from \"./calculator-branch.util\";\nimport { MoCanvasCalculatorDirectionElementUtil } from \"./calculator-diretion-element.until\";\n\nexport class MoCanvasConnectNavigationBottomLeftElementUtil {\n static lineLeft(pointNext: IRect, pointStart: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPositionOrigin = {\n x: pointNext.x,\n y: pointNext.y\n };\n const endPosition = cloneDeep(endPositionOrigin);\n const directionStartY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, endPositionOrigin.y, 'y');\n\n let newPosition = start;\n\n if (directionStartY === 'above') {\n const startQL = { lx: start.x - lineCurve, ly: (start.y ?? 0) + lineCurve };\n const line = {\n start: { x: (start.x ?? 0), y: start.y ?? 0 },\n end: { x: startQL.lx ?? 0, y: startQL.ly ?? 0 }\n };\n\n newPosition = {\n x: pointStart.x - (lineCurve + 10),\n y: MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, line.end.y, lineCurve, true)\n };\n\n separatedPoints.push({ start: line.start, end: line.end, mode: 'vertical-single-curve', id: '1' }); // line vẽ đi khỏi khối đầu tiên\n separatedPoints.push({ start: line.end, end: newPosition, mode: 'horizontal-single-curve', id: '1' }); // line vẽ đi khỏi khối đầu tiên\n }\n\n // kiểm tra hướng thẳng đến end, nếu có khối thì tránh\n endPositionOrigin.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, endPositionOrigin.y, lineCurve);\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksYLeft(newPosition.x ?? 0, newPosition.y ?? 0, lineCurve, endPositionOrigin, directionStartY, obstacleRect, separatedPoints);\n const directionStartX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x, endPositionOrigin.x, 'x');\n\n if (directionStartX === 'center' && directionStartY === 'under') {\n return;\n }\n\n if (Math.abs((straightLine.endPath.x ?? 0) - endPositionOrigin.x) < lineCurve) {\n const listLine = separatedPoints.filter(item => item.id === 'checkAndAvoidBlocksYLeft');\n const elements = listLine.filter(item => item.start.x === straightLine.endPath.x || item.end.x === straightLine.endPath.x);\n\n elements.forEach(item => {\n if (item.start.x === straightLine.endPath.x) {\n item.start.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartX, item.start.x, (lineCurve));\n }\n if (item.end.x === straightLine.endPath.x) {\n item.end.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartX, item.end.x, (lineCurve));\n }\n });\n }\n\n // // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1\n const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPositionOrigin.x, straightLine.endPath.y ?? 0, 'x', obstacleRect) as IRect;\n const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 },\n `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);\n\n if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {\n coordQ1.x1 = straightLine.endPath.x ?? 0;\n coordQ1.y1 = straightLine.endPath.y ?? 0;\n coordQ1.x = straightLine.endPath.x ?? 0;\n coordQ1.y = straightLine.endPath.y ?? 0;\n }\n\n // kiểm tra và vẽ hướng ngang\n const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPosition.x, 'x');\n const pathHorizontal: IPoints[] = [];\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);\n\n if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {\n separatedPoints.push({ start: straightLine.endPath, end: endPosition, mode: 'vertical', id: '6a ' + directionStartY });\n\n return;\n }\n const end = { x: (coordQ1.x ?? 0), y: coordQ1.y ?? 0 };\n\n separatedPoints.push(...pathHorizontal);\n separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang\n if (endPath.x === endPosition.x && endPath.y < endPosition.y) {\n const itemLast = pathHorizontal.find(item => item.end.x === endPath.x);\n\n if (itemLast) {\n itemLast.end.x = endPosition.x + 50;\n endPath.x = itemLast.end.x;\n }\n }\n separatedPoints.push({ start: endPath, end: { x: pointNext.x, y: pointNext.y }, mode: 'horizontal', id: 'lineEnd' });\n }\n\n static rightLeft(elementNext: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPosition = {\n x: elementNext.x,\n y: elementNext.y\n };\n\n // vẽ 1 đường thẳng từ điểm start ra ngoài đã\n const end = { x: (start.x ?? 0) + 10, y: (start.y ?? 0) + 10 };\n\n separatedPoints.push({ start: { x: (start.x ?? 0), y: start.y ?? 0 }, end: end, mode: 'vertical-single-curve', id: '1' });\n\n const endPositionX = cloneDeep(endPosition);\n\n endPositionX.x -= 50;\n\n let separatedPointsCheckAndAvoidBlocks: Array<IPoints> = [];\n\n let { endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocks(end.x ?? 0, (end.y ?? 0), lineCurve, endPositionX, obstacleRect, separatedPointsCheckAndAvoidBlocks);\n\n if (Math.abs((start.x ?? 0) - endPosition.x) < 10 || end.x > endPath.x) {\n endPath = {\n x: end.x,\n y: end.y\n };\n\n separatedPointsCheckAndAvoidBlocks = [];\n }\n\n if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {\n const element = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === endPath.y && item.end.x === endPath.x));\n const elementQR = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === element?.start.y && item.end.x === element.start.x));\n\n if (element) {\n element.start.y = endPosition.y;\n element.end.y = endPosition.y;\n }\n if (elementQR) {\n elementQR.end.y = endPosition.y;\n }\n }\n\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);\n\n if (endPath.y === endPosition.y) {\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'horizontal' });\n\n return;\n }\n if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'vertical' });\n\n return;\n }\n\n // // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');\n\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const endPositionY = cloneDeep(endPosition);\n\n endPositionY.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, endPositionY.y, lineCurve);\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: { x: coordQ1.x ?? 0, y: (coordQ1.y ?? 0) }, mode: 'horizontal-single-curve', id: 'g' });\n\n let avoidBlocksYLine: IPoints[] = [];\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksY(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionY, directionY, obstacleRect, avoidBlocksYLine);\n\n if (directionY === 'under' && (coordQ1.y ?? 0) > endPositionY.y) {\n avoidBlocksYLine = [];\n straightLine.endPath = { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 };\n }\n if (directionY === 'above' && straightLine.endPath.y <= endPosition.y) {\n avoidBlocksYLine = [];\n straightLine.endPath = { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 };\n }\n if (Math.abs((straightLine.endPath.x ?? 0) - endPosition.x) < 15) {\n const elements = avoidBlocksYLine.filter(item => item.start.x === straightLine.endPath.x || item.end.x === straightLine.endPath.x);\n\n elements.forEach(item => {\n if (item.start.x === straightLine.endPath.x) {\n item.start.x += 30;\n }\n if (item.end.x === straightLine.endPath.x) {\n item.end.x += 30;\n }\n });\n }\n\n separatedPoints.push(...avoidBlocksYLine);\n separatedPoints.push({ start: { x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, end: endPosition, mode: 'vertical-single-curve', id: '4' });\n\n return;\n }\n}","import { cloneDeep } from \"@libs-ui/utils\";\nimport { IPoint, IPoints, IRect } from \"../draw-line.interface\";\nimport { MoCanvasCalculatorBranchUtil } from \"./calculator-branch.util\";\nimport { MoCanvasCalculatorDirectionElementUtil } from \"./calculator-diretion-element.until\";\nimport { MoCanvasConnectNavigationBottomLeftElementUtil } from \"./line-connect-bottom-left.until\";\n\nexport interface IPositionXY { x: number, y: number }\nexport class MoCanvasConnectNavigationNewElementUtil {\n static ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT = 32;\n static START_MODE = 'right-left';\n\n static setXYConnectElements(elementFrom: IRect, elementNext: IRect, obstacleRect: IRect[], separatedPoints: Array<IPoints>, curve: number) {\n this.drawLineConnect(elementFrom, elementNext, obstacleRect, separatedPoints, curve);\n }\n\n static drawLineConnect(elementFrom: IRect, elementNext: IRect, obstacleRect: IRect[], separatedPoints: Array<IPoints>, curve: number) {\n let start_x = (elementFrom.x ?? 0) + (elementFrom.width ?? 0); // điểm out luôn ở phía bên phải\n let start_y = (elementFrom.y ?? 0) + (elementFrom.height ?? 0) / 2; // điểm out luôn ở phía bên phải\n\n if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-top') { // điểm out luôn ở phía bên dưới\n start_x = (elementFrom.x ?? 0) + ((elementFrom.width ?? 0) / 2);\n start_y = (elementFrom.y ?? 0) + (elementFrom.height ?? 0);\n }\n if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-left') { // điểm out luôn ở phía bên dưới\n start_x = (elementFrom.x ?? 0) + ((elementFrom.width ?? 0) / 2);\n start_y = (elementFrom.y ?? 0) + (elementFrom.height ?? 0);\n }\n const M_start: IPoint = { x: start_x, y: start_y };\n\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start_x, elementNext.x, 'x');\n\n switch (MoCanvasConnectNavigationNewElementUtil.START_MODE) {\n case 'right-left':\n if (directionX === 'left') {\n this.lineConnectLeft(elementNext, elementFrom, M_start, curve, obstacleRect, separatedPoints);\n\n return;\n }\n this.lineConnectRight(elementNext, M_start, curve, obstacleRect, separatedPoints);\n break;\n\n case 'bottom-top':\n if (directionX === 'left') {\n this.lineConnectLeftWithBottomStart(elementNext, elementFrom, M_start, curve, obstacleRect, separatedPoints);\n\n return;\n }\n this.lineConnectRightWithBottomStart(elementNext, M_start, curve, obstacleRect, separatedPoints);\n break;\n\n case 'bottom-left':\n console.log(directionX);\n if (directionX === 'left') {\n MoCanvasConnectNavigationBottomLeftElementUtil.lineLeft(elementNext, elementFrom, M_start, curve, obstacleRect, separatedPoints);\n\n return;\n }\n MoCanvasConnectNavigationBottomLeftElementUtil.rightLeft(elementNext, M_start, curve, obstacleRect, separatedPoints);\n break;\n }\n }\n\n private static lineConnectRight(elementNext: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPosition = {\n x: (elementNext.x ?? 0) - (lineCurve * 3),\n y: (elementNext.y ?? 0) + (elementNext.height ?? 0) / 2\n };\n\n const endPositionX = cloneDeep(endPosition);\n\n let separatedPointsCheckAndAvoidBlocks: Array<IPoints> = [];\n let { path, endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocks(start.x ?? 0, start.y ?? 0, lineCurve, endPositionX, obstacleRect, separatedPointsCheckAndAvoidBlocks);\n\n if (Math.abs((start.x ?? 0) - endPosition.x) < 10) {\n path = '';\n endPath = {\n x: start.x,\n y: start.y\n };\n\n separatedPointsCheckAndAvoidBlocks = [];\n }\n\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);\n\n // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');\n\n if (directionY === 'center') {\n const LEnd = { x: elementNext.x ?? 0, y: endPath.y };\n\n separatedPoints.push({ start: endPath, end: LEnd, mode: 'horizontal', id: 'f' });\n\n return {\n dPath: `${path} L ${LEnd.x} ${LEnd.y}`,\n endPath: LEnd\n };\n }\n\n let lineCurveSubY = lineCurve;\n\n if (Math.abs((endPath.y ?? 0) - endPosition.y) < lineCurve * 2) {\n lineCurveSubY = Math.abs((endPath.y ?? 0) - endPosition.y) / 2;\n\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurveSubY * 2, lineCurveSubY); // tính đoạn cong từ đường ngang sang đường thẳng\n const pathQ1 = `Q ${coordQ1.x1},${coordQ1.y1} ${coordQ1.x},${coordQ1.y}`; // từ ngang sang thẳng phải có đường cong\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, `${directionY === 'above' ? 'above' : 'under'}-right`, lineCurveSubY * 2, lineCurveSubY); // tính đoạn cong từ đường thẳng sang ngang\n const pathQ2 = `Q ${coordQ2.x1},${coordQ2.y1} ${coordQ2.x},${coordQ2.y}`;\n\n separatedPoints.push({ start: endPath, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'horizontal-single-curve', id: 'g' });\n separatedPoints.push({ start: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'vertical-single-curve', id: 'j' });\n const lineClose = this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPosition, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: `${path} ${pathQ1} ${pathQ2} ${lineClose}`,\n };\n }\n\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n const pathQ1 = `Q ${coordQ1.x1},${coordQ1.y1} ${coordQ1.x},${coordQ1.y}`; // từ ngang sang thẳng phải có đường cong\n const endPositionY = cloneDeep(endPosition);\n\n endPositionY.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, endPosition.y, lineCurve);\n\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksY(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionY, directionY, obstacleRect, separatedPoints);\n\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionY === 'above' ? 'above' : 'under'}-right`, lineCurve, lineCurve); // tính đoạn cong từ đường thẳng sang ngang\n const pathQ2 = `Q ${coordQ2.x1},${coordQ2.y1} ${coordQ2.x},${coordQ2.y}`; // từ ngang sang thẳng phải có đường cong\n\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'horizontal-single-curve', id: 'g' });\n separatedPoints.push({ start: { x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'vertical-single-curve', id: 'j' });\n const lineClose = this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPosition, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: `${path} ${pathQ1} ${straightLine.path} ${pathQ2} ${lineClose}`,\n endPath: straightLine.endPath\n };\n }\n\n private static lineConnectLeft(elementNext: IRect, elementFrom: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPositionOrigin = {\n x: (elementNext.x ?? 0) - (lineCurve * 1.5),\n y: (elementNext.y ?? 0) + (elementNext.height ?? 0) / 2\n };\n\n const endPosition = cloneDeep(endPositionOrigin);\n const directionStartY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, endPositionOrigin.y, 'y');\n\n const endY = (directionStartY === 'under' || directionStartY === 'center') ? (elementNext.y ?? 0) : (elementNext.y ?? 0) + (elementNext.height ?? 0);\n\n endPosition.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, endY, (lineCurve * 2));\n\n const pathQ = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: (start.x ?? 0) + 10, y: start.y ?? 0 }, `right-${directionStartY === 'under' ? 'under' : 'above'}`, lineCurve, lineCurve);\n const startQL = { lx: pathQ.x, ly: MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, (pathQ.y ?? 0), ((elementFrom.height ?? 0) / 2), true) };\n\n separatedPoints.push({ start: { x: (start.x ?? 0), y: start.y ?? 0 }, end: { x: pathQ.x ?? 0, y: pathQ.y ?? 0 }, mode: 'horizontal-single-curve', id: '1' });\n separatedPoints.push({ start: { x: pathQ.x ?? 0, y: pathQ.y ?? 0 }, end: { x: startQL.lx ?? 0, y: startQL.ly }, mode: 'horizontal', id: '2' });\n\n if (directionStartY === 'center') {\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: startQL.lx ?? 0, y: startQL.ly ?? 0 }, `above-left`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n separatedPoints.push({ start: { x: startQL.lx ?? 0, y: startQL.ly }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '3' });\n\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);\n\n const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');\n\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `left-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'horizontal-single-curve', id: '4' });\n this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksYLeft(startQL.lx ?? 0, startQL.ly ?? 0, lineCurve, endPosition, directionStartY, obstacleRect, separatedPoints);\n\n if (Math.abs((endPosition.x ?? 0) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {\n endPosition.x = straightLine.endPath.x;\n }\n\n if ((directionStartY === 'under' && startQL.ly > endPosition.y) || (directionStartY === 'above' && startQL.ly < endPosition.y) || startQL.ly === endPosition.y) {\n let condition = true;\n\n while (condition) {\n const checkAndAvoidBlocksYLeft = separatedPoints.findIndex(item => item.id === \"checkAndAvoidBlocksYLeft\");\n\n if (checkAndAvoidBlocksYLeft !== -1) {\n separatedPoints.splice(checkAndAvoidBlocksYLeft, 1);\n }\n if (checkAndAvoidBlocksYLeft === -1) {\n condition = false;\n }\n }\n\n straightLine.path = '';\n straightLine.endPath = {\n x: startQL.lx ?? 0,\n y: startQL.ly ?? 0\n };\n }\n\n if (endPosition.x === straightLine.endPath.x) {\n separatedPoints.push({ start: straightLine.endPath, end: endPositionOrigin, mode: 'vertical-single-curve', id: '6a ' + directionStartY });\n this.closeLine({ x: endPositionOrigin.x ?? 0, y: endPositionOrigin.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return;\n }\n\n\n // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1,\n const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPosition.x, straightLine.endPath.y ?? 0, 'x', obstacleRect) as IRect;\n const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);\n\n if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {\n coordQ1.x1 = straightLine.endPath.x ?? 0;\n coordQ1.y1 = straightLine.endPath.y ?? 0;\n coordQ1.x = straightLine.endPath.x ?? 0;\n coordQ1.y = straightLine.endPath.y ?? 0;\n }\n\n separatedPoints.push({ start: straightLine.endPath, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '6a ' + directionStartY });\n\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);\n const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');\n const directionNextY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPath.x, 'x');\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `${directionNextY}-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n separatedPoints.push({ start: endPath, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'horizontal-single-curve', id: '6' });\n\n this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n\n private static closeLine(start: IPositionXY, end: IPositionXY, lineCurve: number, elementNext: IRect, separatedPoints: Array<IPoints>) {\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, end.y, 'y');\n\n if (start.y === end.y) {\n separatedPoints.push({ start, end: { x: elementNext.x ?? 0, y: end.y ?? 0 }, mode: 'horizontal', id: '7' });\n\n return `L ${elementNext.x} ${end.y}`;\n }\n\n const line = { x: start.x, y: start.y };\n const endPoint = {\n x: elementNext.x,\n y: end.y\n };\n let pathQ1 = '';\n\n if (Math.abs(start.y - end.y) > lineCurve) {\n const toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, end.y, lineCurve);\n\n line.y = toY;\n\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(line.x, elementNext.x, 'x');\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: line.x ?? 0, y: line.y ?? 0 }, `${directionY === 'above' ? 'above' : 'under'}-${directionX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n let lineL = '';\n\n if (coordQ1.y === end.y) {\n lineL = `L ${endPoint.x} ${endPoint.y}`;\n }\n\n pathQ1 = `Q ${coordQ1.x1},${coordQ1.y1} ${coordQ1.x},${coordQ1.y} ${lineL}`; // từ ngang sang thẳng phải có đường cong\n }\n\n separatedPoints.push({ start, end: line, mode: 'horizontal', id: '8' });\n separatedPoints.push({ start: line, end: endPoint, mode: 'vertical-single-curve', id: '9' });\n\n return `L ${line.x} ${line.y} ${pathQ1}`;\n }\n\n private static lineConnectLeftWithBottomStart(elementNext: IRect, elementFrom: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPositionOrigin = {\n x: (elementNext.x ?? 0) + (elementNext.width ?? 0) / 2,\n y: (elementNext.y ?? 0) - (lineCurve)\n };\n const endPosition = cloneDeep(endPositionOrigin);\n const directionStartY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, endPositionOrigin.y, 'y');\n const endY = (elementNext.y ?? 0);\n\n console.log('directionStartY', directionStartY);\n if (directionStartY === 'under') {\n endPosition.y = endY - (lineCurve * 3);\n }\n\n const startQL = { lx: start.x, ly: (start.y ?? 0) + lineCurve };\n const line = {\n start: { x: (start.x ?? 0), y: start.y ?? 0 },\n end: { x: startQL.lx ?? 0, y: startQL.ly ?? 0 }\n };\n const newEnd = { x: elementFrom.x - (lineCurve * 2), y: line.end.y - lineCurve };\n\n if (directionStartY === 'above') {\n line.end = { x: (start.x ?? 0) - lineCurve, y: (start.y ?? 0) + (lineCurve * 2) };\n\n separatedPoints.push({ start: line.end, end: newEnd, mode: 'horizontal-single-curve', id: '1' });\n }\n separatedPoints.push({ start: line.start, end: line.end, mode: 'vertical-single-curve', id: '1' }); // line vẽ đi khỏi khối đầu tiên\n const startNewLine = directionStartY === 'above' ? newEnd : line.end;\n\n if (directionStartY === 'center') {\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: startQL.lx ?? 0, y: startQL.ly ?? 0 }, `above-left`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n // từ ngang sang thẳng phải có đường cong\n separatedPoints.push({ start: { x: startQL.lx ?? 0, y: startQL.ly }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '3' });\n\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);\n const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `left-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n // từ ngang sang thẳng phải có đường cong\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'horizontal-single-curve', id: '4' });\n this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n\n // kiểm tra hướng thẳng đến end, nếu có khối thì tránh\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksYLeft(startNewLine.x ?? 0, startNewLine.y ?? 0, lineCurve, endPosition, directionStartY, obstacleRect, separatedPoints);\n\n const directionStartX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.x, endPositionOrigin.x, 'x');\n\n if (directionStartX === 'center' && directionStartY === 'under') {\n this.closeLineWithLineTopBottom({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``\n };\n }\n\n if ((directionStartY === 'under' && startQL.ly > endPosition.y) || (directionStartY === 'above' && startQL.ly < endPosition.y) || startQL.ly === endPosition.y) {\n let condition = true;\n\n while (condition) {\n const checkAndAvoidBlocksYLeft = separatedPoints.findIndex(item => item.id === \"checkAndAvoidBlocksYLeft\");\n\n if (checkAndAvoidBlocksYLeft !== -1) {\n separatedPoints.splice(checkAndAvoidBlocksYLeft, 1);\n }\n if (checkAndAvoidBlocksYLeft === -1) {\n condition = false;\n }\n }\n\n straightLine.path = '';\n straightLine.endPath = {\n x: startQL.lx ?? 0,\n y: startQL.ly ?? 0\n };\n }\n\n // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1\n const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPosition.x, straightLine.endPath.y ?? 0, 'x', obstacleRect) as IRect;\n const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);\n\n if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {\n coordQ1.x1 = straightLine.endPath.x ?? 0;\n coordQ1.y1 = straightLine.endPath.y ?? 0;\n coordQ1.x = straightLine.endPath.x ?? 0;\n coordQ1.y = straightLine.endPath.y ?? 0;\n }\n\n // kiểm tra và vẽ hướng ngang\n const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPositionOrigin.x, 'x');\n\n endPosition.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionXToEnd, endPosition.x, lineCurve);\n if (Math.abs((coordQ1.y ?? 0) - endPosition.y) <= lineCurve) {\n endPosition.y -= lineCurve;\n }\n const pathHorizontal: IPoints[] = [];\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);\n\n if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {\n separatedPoints.push({ start: straightLine.endPath, end: endPositionOrigin, mode: 'vertical', id: '6a ' + directionStartY });\n this.closeLineWithLineTopBottom(endPositionOrigin, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return;\n }\n\n separatedPoints.push(...pathHorizontal);\n separatedPoints.push({ start: straightLine.endPath, end: { x: (coordQ1.x ?? 0 - 10), y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '6a ' + directionStartY });\n this.closeLineWithLineTopBottom({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n\n private static closeLineWithLineTopBottom(start: IPositionXY, end: IPositionXY, lineCurve: number, elementNext: IRect, separatedPoints: Array<IPoints>) {\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.x, end.x, 'x');\n\n if (start.x === end.x) {\n separatedPoints.push({ start, end: { x: (elementNext.x ?? 0) + (elementNext.width ?? 0) / 2, y: elementNext.y ?? 0 }, mode: 'horizontal', id: '7' });\n\n return `L ${elementNext.x} ${end.y}`;\n }\n\n const line = { x: start.x, y: start.y };\n const endPoint = {\n x: end.x,\n y: elementNext.y\n };\n const pathQ1 = '';\n\n if (Math.abs(start.x - end.x) > lineCurve) {\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, endPoint.y, 'y');\n const toX = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, end.x, lineCurve);\n const toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, end.y, lineCurve);\n\n line.x = toX;\n line.y = toY;\n separatedPoints.push({ start: start, end: line, mode: 'vertical-single-curve', id: '9' });\n }\n\n separatedPoints.push({ start: line, end: endPoint, mode: 'horizontal-single-curve', id: '9' });\n\n return `L ${line.x} ${line.y} ${pathQ1}`;\n }\n\n private static lineConnectRightWithBottomStart(elementNext: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPosition = {\n x: (elementNext.x ?? 0) + (elementNext.width ?? 0) / 2,\n y: (elementNext.y ?? 0) - (lineCurve)\n };\n\n // vẽ 1 đường thẳng từ điểm start ra ngoài đã\n const end = { x: (start.x ?? 0) + 10, y: (start.y ?? 0) + 20 };\n\n separatedPoints.push({ start: { x: (start.x ?? 0), y: start.y ?? 0 }, end: end, mode: 'vertical-single-curve', id: '1' });\n\n const endPositionX = cloneDeep(endPosition);\n\n endPositionX.x -= 10;\n\n let separatedPointsCheckAndAvoidBlocks: Array<IPoints> = [];\n let { path, endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocks(end.x ?? 0, (end.y ?? 0), lineCurve, endPositionX, obstacleRect, separatedPointsCheckAndAvoidBlocks);\n\n if (Math.abs((start.x ?? 0) - endPosition.x) < 10) {\n path = '';\n endPath = {\n x: start.x,\n y: start.y\n };\n\n separatedPointsCheckAndAvoidBlocks = [];\n }\n\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);\n\n // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');\n\n if (directionY === 'center') {\n const LEnd = { x: elementNext.x ?? 0, y: endPath.y };\n\n separatedPoints.push({ start: endPath, end: LEnd, mode: 'horizontal', id: 'f' });\n\n // đoạn này chưa oce\n this.closeLineWithLineTopBottom(LEnd, endPosition, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: `${path} L ${LEnd.x} ${LEnd.y}`,\n endPath: LEnd\n };\n }\n\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const endPositionY = cloneDeep(endPosition);\n\n endPositionY.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, endPosition.y, lineCurve) - 10;\n\n // cần check khi đi thẳng lên có vướng khối nào không để tiến lên\n const elementBlockRoadStraightLineY = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementStraightY((endPath.x ?? 0) + 10, endPath.y ?? 0, endPositionY, obstacleRect);\n\n if (elementBlockRoadStraightLineY) {\n coordQ1.x = (elementBlockRoadStraightLineY.x ?? 0) + (elementBlockRoadStraightLineY.width ?? 0) + lineCurve;\n }\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: { x: coordQ1.x ?? 0, y: (coordQ1.y ?? 0) }, mode: 'horizontal-single-curve', id: 'g' });\n\n let avoidBlocksYLine: IPoints[] = [];\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksY(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionY, directionY, obstacleRect, avoidBlocksYLine);\n\n if (directionY === 'under' && (coordQ1.y ?? 0) > endPositionY.y) {\n avoidBlocksYLine = [];\n straightLine.endPath = { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 };\n }\n separatedPoints.push(...avoidBlocksYLine);\n this.closeLineWithLineTopBottom({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, endPosition, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n}","import { AfterViewInit, ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, NgZone, OnDestroy, Output, inject } from \"@angular/core\";\nimport { checkMouseOverInContainer, cloneDeep, get, getDragEventByElement } from \"@libs-ui/utils\";\nimport { Subject, takeUntil, tap } from \"rxjs\";\nimport { IAttributeDOnPath, ICircleStyle, IDrawLineDataInput, IMoDrawLineFunctionControl, IPoint, IPoints, IReachablePointRange, IRect, IViewBoxConfig, TYPE_DIRECTION, TYPE_MODE } from \"./draw-line.interface\";\nimport { MoCanvasConnectNavigationNewElementUtil } from \"./util/connect-navigation-new-element.util\";\n\nexport * from \"./draw-line.interface\";\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiComponentsDrawLineDirective]\",\n standalone: true,\n})\nexport class LibsUiComponentsDrawLineDirective implements AfterViewInit, OnDestroy {\n protected cdr = inject(ChangeDetectorRef);\n protected zone = inject(NgZone);\n protected elementRef = inject(ElementRef);\n protected intervalScrollToElement?: number;\n private dataDraw: Array<IDrawLineDataInput> = [];\n private dataReachablePointRange: Array<IReachablePointRange> = [];\n private onDrawLineEnd: Subject<{\n dataLine: IDrawLineDataInput,\n event: MouseEvent\n }> = new Subject();\n private onDestroy = new Subject<void>();\n\n @Input() viewBoxConfig?: IViewBoxConfig;\n @Input() svgElement!: SVGSVGElement;\n @Input() drawRectDebug?: boolean;\n\n @Output() outDrawLineFunctionControl: EventEmitter<IMoDrawLineFunctionControl> = new EventEmitter();\n @Output() outConnected: EventEmitter<{ dataLine: IDrawLineDataInput, dataReachablePointRange: IReachablePointRange }> = new EventEmitter();\n\n\n ngAfterViewInit(): void {\n this.svgElement = this.svgElement || document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n this.elementRef.nativeElement.append(this.svgElement);\n this.outDrawLineFunctionControl.emit({\n setData: this.setData.bind(this),\n setReachablePointRange: this.setReachablePointRange.bind(this),\n removeLine: this.removeLine.bind(this),\n removeReachablePointRange: this.removeReachablePointRange.bind(this),\n updateViewBox: this.updateViewBox.bind(this)\n });\n }\n\n private setData(data: Array<IDrawLineDataInput>) {\n const newData: Array<IDrawLineDataInput> = [];\n\n data.forEach(item => {\n if (this.dataDraw.find(dataDraw => dataDraw.id === item.id && item.points.start.x === dataDraw.points.start.x && item.points.start.y === dataDraw.points.start.y && item.points.end.x === dataDraw.points.end.x && item.points.end.y === dataDraw.points.end.y)) {\n return;\n }\n const itemClone = cloneDeep(item);\n\n itemClone.ref = item;\n newData.push(itemClone);\n });\n\n this.dataDraw.push(...newData);\n this.startProcessDataRow(newData);\n }\n\n\n setReachablePointRange(data: Array<IReachablePointRange>) {\n const newData: Array<IReachablePointRange> = [];\n\n data.forEach(item => {\n if (this.dataReachablePointRange.find(dataDraw => dataDraw.id === item.id || item.x === dataDraw.x && item.y === dataDraw.y)) {\n return;\n }\n const itemClone = cloneDeep(item);\n\n itemClone.ref = item;\n newData.push(itemClone);\n });\n\n this.dataReachablePointRange.push(...newData);\n this.startProcessDataReachablePointRange(newData);\n }\n\n private removeLine(id: string, points?: Array<IPoints>) {\n const dataDrawById = this.dataDraw.filter(item => item.id === id);\n\n if (!dataDrawById?.length) {\n return;\n }\n\n const removeByItem = (item: IDrawLineDataInput) => {\n this.removeElementOfPoints(item.points);\n item.points.separatedPoints?.forEach(separatedPoints => this.removeElementOfPoints(separatedPoints));\n\n };\n\n if (!points?.length) {\n dataDrawById.forEach(item => removeByItem(item));\n this.dataDraw = this.dataDraw.filter(item => item.id !== id);\n this.updateViewBox();\n\n return;\n }\n\n points.forEach(point => {\n const dataDrawRemoveByPoint = dataDrawById.find(item => item.points.start.x === point.start.x && item.points.start.y === point.start.y && item.points.end.x === point.end.x && item.points.end.y === point.end.y);\n\n if (dataDrawRemoveByPoint) {\n dataDrawRemoveByPoint.isRemove = true;\n removeByItem(dataDrawRemoveByPoint);\n this.dataDraw = this.dataDraw.filter(item => item.id !== id && !item.isRemove);\n }\n });\n this.updateViewBox();\n\n }\n\n private removeReachablePointRange(ids: Array<string>) {\n this.clearRect();\n if (!ids.length) {\n return;\n }\n\n ids.forEach(id => {\n const itemRemove = this.dataReachablePointRange?.find(item => item.id === id);\n\n if (!itemRemove) {\n return;\n }\n itemRemove.onDestroyEvent?.next();\n itemRemove.element?.remove();\n this.dataReachablePointRange = this.dataReachablePointRange?.filter(item => item.id !== id);\n });\n }\n\n private startProcessDataRow(dataDraw: Array<IDrawLineDataInput>) {\n this.zone.runOutsideAngular(() => {\n dataDraw.forEach(item => {\n const { pathElement, arrowElement, circleStartElement, circleEndElement } = this.createPathAndArrowElement(item.id);\n\n item.points.obstacleRect?.forEach(data => this.addRect('rect', data));\n item.points.pathElement = pathElement;\n item.points.arrowElement = arrowElement;\n if (item.startCircle) {\n item.points.circleStartElement = circleStartElement;\n this.svgElement.append(circleStartElement);\n }\n if (item.endCircle) {\n item.points.circleEndElement = circleEndElement;\n this.svgElement.append(circleEndElement);\n }\n item.points.onDestroyEvent = new Subject();\n this.drawLine(item);\n });\n this.updateViewBox();\n });\n }\n\n private startProcessDataReachablePointRange(data: Array<IReachablePointRange>) {\n this.zone.runOutsideAngular(() => {\n data.forEach(item => {\n item.onDestroyEvent = new Subject();\n item.element = this.createPathAndArrowElement(item.id).circleEndElement;\n this.svgElement.append(item.element);\n this.updateAttributeCircle(item.element, item.id, item, item.style);\n this.onDrawLineEnd.pipe(takeUntil(item.onDestroyEvent), takeUntil(this.onDestroy)).subscribe(eventData => {\n const { dataLine, event } = eventData;\n\n if (!checkMouseOverInContainer(event, item.element as unknown as HTMLElement) || !dataLine.ref || !item.ref) {\n return;\n }\n\n item.idConnected = eventData.dataLine.id;\n eventData.dataLine.idConnected = item.id;\n this.outConnected.emit({\n dataLine: dataLine.ref,\n dataReachablePointRange: item.ref\n });\n });\n });\n this.updateViewBox();\n });\n }\n\n private removeElementOfPoints(points: IPoints) {\n this.zone.runOutsideAngular(() => {\n points.onDestroyEvent?.next();\n points.onDestroyEvent?.complete();\n points?.pathElement?.remove();\n points?.arrowElement?.remove();\n points?.circleStartElement?.remove();\n points.circleEndElement?.remove();\n });\n }\n\n private drawLine(data: IDrawLineDataInput) {\n this.zone.runOutsideAngular(() => {\n const { points, mode } = data;\n let { curve } = data?.lineStyle || {};\n\n if (mode !== 'quart-in') {\n curve = curve ?? 10;\n }\n const preLengthSeparatedPoints = points.separatedPoints?.length;\n\n points.separatedPoints?.forEach(separatedPoints => this.removeElementOfPoints(separatedPoints));\n points.separatedPoints = [];\n MoCanvasConnectNavigationNewElementUtil.START_MODE = 'right-left';\n if (data.startEndMode) {\n MoCanvasConnectNavigationNewElementUtil.START_MODE = data.startEndMode;\n }\n this.calculatorSeparatedPoints(data.id, points, curve || 10, points.separatedPoints, points.obstacleRect || []);\n if (!preLengthSeparatedPoints && points.separatedPoints.length) {\n this.removeElementOfPoints(points);\n const { pathElement, arrowElement } = this.createPathAndArrowElement(data.id);\n\n points.pathElement = pathElement;\n points.arrowElement = arrowElement;\n points.initialized = false;\n }\n if (!points.separatedPoints?.length) {\n this.buildPathAndDraw(data, points, mode);\n\n return;\n }\n\n let path = '';\n\n points.separatedPoints.forEach(separatedPoints => {\n path += this.buildPathAndDrawSeparatedPoints(data, separatedPoints, separatedPoints.mode || mode);\n });\n const pathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n\n this.svgElement.append(pathElement);\n points.pathElement = pathElement;\n const styleConfig = {\n stroke: data.lineStyle?.stroke ?? '#9CA2AD',\n strokeDasharray: data.lineStyle?.strokeDasharray,\n strokeWidth: data.lineStyle?.strokeWidth ?? '1px',\n fill: data.lineStyle?.fill ?? 'none',\n curve: data.lineStyle?.curve ?? 10,\n distancePoint: data.lineStyle?.distancePoint ?? 10\n };\n\n points.pathElement?.setAttribute('stroke', styleConfig.stroke);\n points.pathElement?.setAttribute('fill', styleConfig.fill);\n points.pathElement?.setAttribute('stroke-width', styleConfig.strokeWidth);\n if (styleConfig.strokeDasharray) {\n points.pathElement?.setAttribute('stroke-dasharray', styleConfig.strokeDasharray)\n }\n points.pathElement?.setAttribute('d', path);\n this.drawRectAndInitEvent(data, mode);\n });\n }\n\n private updateViewBox(viewBoxConfig?: IViewBoxConfig) {\n if (viewBoxConfig) {\n this.viewBoxConfig = viewBoxConfig;\n }\n const xPoints: Set<number> = new Set([0]);\n const yPoints: Set<number> = new Set([0]);\n\n const addPoints = (points: IPoints) => {\n xPoints.add(points.start.x);\n xPoints.add(points.end.x);\n yPoints.add(points.start.y);\n yPoints.add(points.end.y);\n };\n\n this.dataDraw?.forEach(item => {\n const points = item.points;\n\n addPoints(points);\n points.separatedPoints?.forEach(separatedPoints => addPoints(separatedPoints));\n points.obstacleRect?.forEach(obstacleRect => {\n addPoints({\n start: { x: obstacleRect.x - (obstacleRect.gapXObstacleRect || 8), y: obstacleRect.y - (obstacleRect.gapYObstacleRect || 8) },\n end: { x: obstacleRect.x + obstacleRect.width + (obstacleRect.gapXObstacleRect || 8) * 2, y: obstacleRect.y + obstacleRect.height + (obstacleRect.gapYObstacleRect || 8) * 2 }\n });\n });\n });\n\n const xMax = this.viewBoxConfig?.width ?? (xPoints.size ? Math.max(...xPoints) : 0) + 14;\n const yMax = this.viewBoxConfig?.height ?? (yPoints.size ? Math.max(...yPoints) : 0) + 14;\n\n if (!this.viewBoxConfig?.ignoreViewBox) {\n const rectSvgElement = this.svgElement.getBoundingClientRect();\n\n this.svgElement?.setAttribute('viewBox', `${this.viewBoxConfig?.minX ?? rectSvgElement.x} ${this.viewBoxConfig?.minY ?? rectSvgElement.y} ${xMax} ${yMax}`);\n }\n this.svgElement?.setAttribute('width', `${xMax ?? 0}`);\n this.svgElement?.setAttribute('height', `${yMax ?? 0}`);\n }\n\n private isPointInsideSquare(point: IPoint, square: IRect): boolean {\n const { x, y } = point;\n const { x: squareX, y: squareY, width, height } = square;\n\n return x >= squareX && x <= squareX + width && y >= squareY && y <= squareY + height;\n }\n\n private calculatorSeparatedPoints(name: string, points: IPoints, curve: number, separatedPoints: Array<IPoints>, obstacleRects: Array<IRect>) {\n if (!obstacleRects.length) {\n return;\n }\n\n const elementStart = obstacleRects.find(item => this.isPointInsideSquare(points.start, item));\n const elementEnd = obstacleRects.find(item => this.isPointInsideSquare(points.end, item));\n\n if (this.viewBoxConfig?.marginBetweenElement) {\n MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT = this.viewBoxConfig?.marginBetweenElement ?? 32;\n }\n MoCanvasConnectNavigationNewElementUtil.setXYConnectElements(elementStart ?? { ...points.start, width: 1, height: 1 }, elementEnd ?? { ...points.end, width: 1, height: 1 }, obstacleRects, separatedPoints, curve);\n }\n\n private buildPathAndDraw(data: IDrawLineDataInput, points: IPoints, mode?: TYPE_MODE) {\n let dPath = {} as IAttributeDOnPath;\n const styleConfig = {\n stroke: data.lineStyle?.stroke ?? '#9CA2AD',\n strokeDasharray: data.lineStyle?.strokeDasharray,\n strokeWidth: data.lineStyle?.strokeWidth ?? '1px',\n fill: data.lineStyle?.fill ?? 'none',\n curve: data.lineStyle?.curve ?? 10,\n distancePoint: data.lineStyle?.distancePoint ?? 10\n };\n\n points.pathElement?.setAttribute('stroke', styleConfig.stroke);\n points.pathElement?.setAttribute('fill', styleConfig.fill);\n points.pathElement?.setAttribute('stroke-width', styleConfig.strokeWidth);\n if (styleConfig.strokeDasharray) {\n points.pathElement?.setAttribute('stroke-dasharray', styleConfig.strokeDasharray);\n }\n let { curve, distancePoint } = styleConfig;\n\n mode = mode || \"quart-in\";\n if (mode !== 'quart-in') {\n curve = curve ?? 10;\n distancePoint = distancePoint ?? 10;\n }\n if (mode === 'quart-in' || points.start.x === points.end.x || points.start.y === points.end.y) {\n this.drawBalancedCurve(dPath, points);\n\n if (mode === 'quart-in') {\n dPath = {} as IAttributeDOnPath;\n this.drawBendBothEndsCurve(dPath, points);\n }\n points.pathElement?.setAttribute('d', this.builDAttributeToString(dPath));\n this.drawRectAndInitEvent(data, mode);\n\n return;\n }\n const result = this.calculatorDistancePointAndCurve(points, distancePoint, curve, mode);\n\n distancePoint = result.distancePoint;\n curve = result.curve;\n\n this.buildDAttributeByPointEndModeHorizontal(dPath, points, distancePoint || 0, curve || 0, mode);\n this.buildDAttributeByPointEndModeVertical(dPath, points, distancePoint || 0, curve || 0, mode);\n points.pathElement?.setAttribute('d', this.builDAttributeToString(dPath));\n this.drawRectAndInitEvent(data, mode);\n }\n\n private calculatorDistancePointAndCurve(points: IPoints, distancePoint: number, curve: number, mode: TYPE_MODE) {\n if ((!mode.includes('vertical') && !mode.includes('horizontal'))) {\n return { curve, distancePoint };\n }\n const gapX = Math.abs(points.start.x - points.end.x);\n const gapY = Math.abs(points.start.y - points.end.y);\n const multiplierCurve = mode.includes('horizontal') ? 1 : 2;\n const multiplierDistance = mode.includes('horizontal') ? 2 : 1;\n\n if (!mode.includes('single-curve')) {\n if (gapX < distancePoint * multiplierDistance + curve * multiplierCurve) {\n distancePoint = curve = gapX / 3;\n }\n if (gapY < distancePoint * multiplierDistance + curve * multiplierCurve) {\n distancePoint = curve = gapY / 3;\n }\n\n return { curve, distancePoint };\n }\n const minGap = Math.min(gapX, gapY);\n\n if (minGap < distancePoint) {\n distancePoint = minGap;\n }\n if (minGap < curve) {\n curve = minGap;\n }\n\n return { curve, distancePoint };\n }\n\n private drawRectAndInitEvent(data: IDrawLineDataInput, mode: TYPE_MODE) {\n const points = data.points;\n\n this.updateStyleArrow(points, mode, data);\n if (data.startCircle && points.circleStartElement) {\n this.updateAttributeCircle(points.circleStartElement, data.id, points.start, data.startCircleStyle);\n }\n if (data.endCircle && points.circleEndElement) {\n this.updateAttributeCircle(points.circleEndElement, data.id, points.end, data.endCircleStyle);\n }\n this.initEvent(data);\n }\n\n private drawBalancedCurve(dPath: IAttributeDOnPath, points: IPoints) {\n dPath.M = { x: points.start.x, y: points.start.y };\n dPath.Q = [{ x: points.start.x + (points.end.x - points.start.x) / 4, y: points.start.y + (points.end.y - points.start.y) / 2 }, { x: points.start.x + (points.end.x - points.start.x) / 2, y: points.start.y + (points.end.y - points.start.y) / 2 }];\n dPath.Q2 = [{ x: points.end.x - (points.end.x - points.start.x) / 4, y: points.start.y + (points.end.y - points.start.y) / 2 }, { x: points.end.x, y: points.end.y }];\n }\n\n private drawBendBothEndsCurve(dPath: IAttributeDOnPath, points: IPoints) {\n const pointXCurve = (points.start.x + points.end.x) * 0.5;\n const pointControl1 = { x: pointXCurve, y: points.start.y };\n const pointControl2 = { x: pointXCurve, y: points.end.y };\n\n dPath.M = { x: points.start.x, y: points.start.y };\n dPath.C = [{ x: pointControl1.x, y: pointControl1.y }, { x: pointControl2.x, y: pointControl2.y }, { x: points.end.x, y: points.end.y }];\n }\n\n private buildDAttributeByPointEndModeHorizontal(dPath: IAttributeDOnPath, points: IPoints, distancePoint: number, curve: number, mode: TYPE_MODE) {\n if (!mode.includes('horizontal')) {\n return;\n }\n const multiplierX = points.start.x < points.end.x ? -1 : 1;\n const multiplierY = points.start.y < points.end.y ? 1 : -1;\n const reverseMultiplier = -1;\n\n dPath.M = { x: points.start.x, y: points.start.y };\n dPath.L = { x: points.end.x + ((distancePoint * 2 + curve) * multiplierX), y: points.start.y };\n if (mode.includes('horizontal-single')) {\n dPath.L.x = points.end.x + (curve * multiplierX);\n }\n dPath.Q = [{ x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: points.start.y }, { x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: points.start.y + (curve * multiplierY) }];\n dPath.L2 = { x: dPath.Q[1].x, y: points.end.y + (curve * multiplierY * reverseMultiplier) };\n if (mode.includes('horizontal-single')) {\n dPath.L2 = points.end;\n }\n if (mode === 'horizontal') {\n dPath.Q2 = [{ x: dPath.L2.x, y: points.end.y }, { x: dPath.L2.x + (distancePoint * multiplierX * reverseMultiplier), y: points.end.y }];\n dPath.L3 = { x: points.end.x, y: points.end.y };\n }\n }\n\n private buildDAttributeByPointEndModeVertical(dPath: IAttributeDOnPath, points: IPoints, distancePoint: number, curve: number, mode: TYPE_MODE) {\n if (!mode.includes('vertical')) {\n return;\n }\n const multiplierX = points.start.x < points.end.x ? -1 : 1;\n const multiplierY = points.start.y < points.end.y ? 1 : -1;\n const reverseMultiplier = -1;\n\n dPath.M = points.start;\n dPath.L = { x: points.start.x, y: points.start.y + (distancePoint * multiplierY) };\n if (mode.includes('vertical-single')) {\n dPath.L.y = points.end.y + (distancePoint * multiplierY * reverseMultiplier);\n }\n dPath.Q = [{ x: dPath.L.x, y: dPath.L.y + (curve * multiplierY) }, { x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: dPath.L.y + (curve * multiplierY) }];\n dPath.L2 = { x: points.end.x + ((curve * 2) * multiplierX), y: dPath.Q[1].y };\n if (mode.includes('vertical-single')) {\n dPath.L2 = points.end;\n }\n if (mode === 'vertical') {\n dPath.Q2 = [{ x: points.end.x, y: dPath.L2.y }, { x: points.end.x, y: dPath.L2.y + (curve * multiplierY) }];\n dPath.L3 = { x: points.end.x, y: points.end.y };\n }\n }\n\n private builDAttributeToString(dAttribute: IAttributeDOnPath): string {\n let dString = '';\n\n Object.keys(dAttribute).forEach(key => {\n const data = get(dAttribute, key);\n\n if (Array.isArray(data)) {\n const [point1, point2, point3] = data;\n\n dString = `${dString}${key.replace(/\\d/g, '')}${point1.x},${point1.y} ${point2.x},${point2.y}${point3 ? ' ' + point3.x + ',' + point3.y : ''}\n `;\n\n return;\n }\n dString = `${dString}${key.replace(/\\d/g, '')}${data.x},${data.y}\n `;\n });\n\n return dString;\n }\n\n private updateStyleArrow(points: IPoints, mode: TYPE_MODE, data: IDrawLineDataInput) {\n if (!points.arrowElement || data.ignoreDrawArrow) {\n return;\n }\n const styleConfig = {\n fill: data.arrowStyle?.fill ?? '#9CA2AD',\n stroke: data.arrowStyle?.stroke ?? 'none',\n strokeWidth: data.arrowStyle?.strokeWidth ?? '0',\n width: data.arrowStyle?.width ?? 6,\n height: data.arrowStyle?.height ?? 8\n };\n const pointEnd = cloneDeep(points.end);\n const arrowElement = points.arrowElement;\n const direction = data.arrowDirection || this.getDirection(points, data.startEndMode);\n\n\n\n switch (direction) {\n case 'right':\n if (mode.includes('horizontal') || mode.includes('vertical')) {\n pointEnd.x -= styleConfig.height;\n }\n arrowElement?.setAttribute('points', `${pointEnd.x},${pointEnd.y - styleConfig.width} ${pointEnd.x + styleConfig.height},${pointEnd.y} ${pointEnd.x},${pointEnd.y + styleConfig.width} `);\n break;\n\n case 'left':\n if (mode.includes('horizontal') || mode.includes('vertical')) {\n pointEnd.x += styleConfig.height;\n }\n arrowElement?.setAttribute('points', `${pointEnd.x},${pointEnd.y - styleConfig.width} ${pointEnd.x - styleConfig.height},${pointEnd.y} ${pointEnd.x},${pointEnd.y + styleConfig.width} `);\n break;\n\n case 'top':\n if (mode.includes('horizontal') || mode.includes('vertical')) {\n pointEnd.y += styleConfig.height;\n }\n arrowElement?.setAttribute('points', `${pointEnd.x - styleConfig.width},${pointEnd.y} ${pointEnd.x},${pointEnd.y - styleConfig.height} ${pointEnd.x + styleConfig.width},${pointEnd.y} `);\n break;\n\n case 'bottom':\n if (mode.includes('horizontal') || mode.includes('vertical')) {\n pointEnd.y -= styleConfig.height;\n }\n arrowElement?.setAttribute('points', `${pointEnd.x - styleConfig.width},${pointEnd.y} ${pointEnd.x},${pointEnd.y + styleConfig.height} ${pointEnd.x + styleConfig.width},${pointEnd.y} `);\n break;\n }\n\n arrowElement?.setAttribute('fill', styleConfig.fill);\n arrowElement?.setAttribute('stroke', styleConfig.stroke);\n arrowElement?.setAttribute('stroke-width', styleConfig.strokeWidth);\n }\n\n private updateAttributeCircle(circleElement: SVGCircleElement, name: string, point: { x: number, y: number }, circleStyle?: ICircleStyle) {\n circleElement.setAttribute('name', name);\n circleElement.setAttribute('cx', `${point.x}`);\n circleElement.setAttribute('cy', `${point.y}`);\n circleElement.setAttribute('r', `${circleStyle?.r ?? 2}`);\n circleElement.setAttribute('fill', `${circleStyle?.fill ?? 'green'}`);\n circleElement.setAttribute('stroke', `${circleStyle?.stroke ?? '#9CA2AD'}`);\n circleElement.setAttribute('stroke-width', `${circleStyle?.strokeWidth ?? '1px'}`);\n\n return circleElement;\n }\n\n private getDirection(points: IPoints, startEndMode: 'right-left' | 'bottom-top' | 'bottom-left' | undefined): TYPE_DIRECTION {\n let pointStart = { ...points.start };\n\n if (points.separatedPoints) {\n const lineToEnd = points.separatedPoints.find(item => item.end.x === points.end.x && item.end.y === points.end.y);\n\n if (lineToEnd) {\n pointStart = lineToEnd.start;\n }\n }\n const modeHorizontal = pointStart.x < points.end.x ? 'right' : 'left';\n const modeVertical = pointStart.y < points.end.y ? 'bottom' : 'top';\n\n if (!startEndMode) {\n if (Math.abs(points.end.x - pointStart.x) > Math.abs(points.end.y - pointStart.y)) {\n return modeHorizontal;\n }\n\n return modeVertical;\n }\n\n switch (startEndMode) {\n case 'bottom-left':\n return modeHorizontal;\n\n case 'right-left':\n return modeHorizontal;\n\n case 'bottom-top':\n return modeVertical;\n }\n }\n\n private initEvent(data: IDrawLineDataInput) {\n const points: IPoints = data.points;\n let preEvent: MouseEvent | undefined = undefined;\n\n if ((!points.arrowElement && !points.circleEndElement) || !points.onDestroyEvent || points.initialized) {\n return;\n }\n\n points.initialized = true;\n const functionMouseUp = (mouseEvent: MouseEvent) => {\n if (preEvent) {\n preEvent = undefined;\n this.onDrawLineEnd.next({ dataLine: data, event: mouseEvent });\n }\n }\n\n const handlerDrag = (dragMouseEvent: MouseEvent) => {\n if (!preEvent) {\n preEvent = dragMouseEvent;\n }\n const pointEnd = cloneDeep(points.end);\n\n const movementX = dragMouseEvent.clientX - preEvent.clientX;\n const movementY = dragMouseEvent.clientY - preEvent.clientY;\n\n preEvent = dragMouseEvent;\n pointEnd.x += movementX;\n pointEnd.y += movementY;\n if (data.points?.obstacleRect?.length && data.points?.obstacleRect.some(obstacleRect => this.checkPointIncludeRect(pointEnd, obstacleRect))) {\n\n return;\n }\n points.end.x = pointEnd.x;\n points.end.y = pointEnd.y;\n this.drawLine(data);\n this.updateViewBox();\n };\n\n if (points.arrowElement) {\n getDragEventByElement({\n elementMouseDown:points.arrowElement as unknown as HTMLElement,\n functionMouseUp:functionMouseUp,\n onDestroy:this.onDestroy\n }).pipe(tap(handlerDrag), takeUntil(points.onDestroyEvent)).subscribe();\n }\n\n if (points.circleEndElement) {\n getDragEventByElement({\n elementMouseDown:points.circleEndElement as unknown as HTMLElement,\n functionMouseUp:functionMouseUp,\n onDestroy:this.onDestroy,\n }).pipe(tap(handlerDrag), takeUntil(points.onDestroyEvent)).subscribe();\n }\n }\n\n private checkPointIncludeRect(point: { x: number, y: number }, obstacleRect: IRect): boolean {\n const gapDefault = 8;\n\n obstacleRect = {\n x: obstacleRect.x - (obstacleRect.gapXObstacleRect || gapDefault),\n y: obstacleRect.y - (obstacleRect.gapYObstacleRect || gapDefault),\n width: obstacleRect.width + (obstacleRect.gapXObstacleRect || gapDefault) * 2,\n height: obstacleRect.height + (obstacleRect.gapYObstacleRect || gapDefault) * 2\n };\n if ((obstacleRect.x <= point.x && point.x <= obstacleRect.x + obstacleRect.width) && (obstacleRect.y <= point.y && point.y <= obstacleRect.y + obstacleRect.height)) {\n return true;\n }\n\n return false;\n }\n\n private createPathAndArrowElement(name: string) {\n const pathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const arrowElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polyline\");\n const circleStartElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n const circleEndElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n\n pathElement.setAttribute('name', name);\n arrowElement.setAttribute('name', name);\n this.svgElement.append(pathElement);\n this.svgElement.append(arrowElement);\n\n return { pathElement, arrowElement, circleStartElement, circleEndElement };\n }\n\n private addCircle(name: string, point: { x: number, y: number }) {\n if (!this.drawRectDebug) {\n return;\n }\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n\n circle.setAttribute('name', name);\n circle.setAttribute('cx', `${point.x}`);\n circle.setAttribute('cy', `${point.y}`);\n circle.setAttribute('r', '2');\n circle.setAttribute('style', 'fill: none; stroke: blue; stroke-width: 1px;');\n this.svgElement.appendChild(circle);\n }\n\n private clearCircle() {\n if (!this.drawRectDebug) {\n return;\n }\n Array.from(this.svgElement.getElementsByTagName('circle'))?.forEach(item => item.remove());\n }\n\n private addRect(name: string, rect: IRect) {\n if (!this.drawRectDebug) {\n return;\n }\n const rectElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n const textElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\n rectElement.setAttribute('name', name);\n rectElement.setAttribute('x', `${rect.x}`);\n rectElement.setAttribute('y', `${rect.y}`);\n rectElement.setAttribute('width', `${rect.width}`);\n rectElement.setAttribute('height', `${rect.height}`);\n rectElement.setAttribute('style', 'fill: blue; stroke: blue;');\n this.svgElement.appendChild(rectElement);\n\n textElement.setAttribute('x', `${rect.x}`);\n textElement.setAttribute('y', `${rect.y}`);\n textElement.textContent = rect.id ?? '';\n this.svgElement.appendChild(textElement);\n }\n\n private clearRect() {\n if (!this.drawRectDebug) {\n return;\n }\n Array.from(this.svgElement.getElementsByTagName('rect'))?.forEach(item => item.remove());\n Array.from(this.svgElement.getElementsByTagName('text'))?.forEach(item => item.remove());\n }\n\n private buildPathAndDrawSeparatedPoints(data: IDrawLineDataInput, points: IPoints, mode?: TYPE_MODE) {\n let dPath = {} as IAttributeDOnPath;\n const styleConfig = {\n curve: data.lineStyle?.curve ?? 10,\n distancePoint: data.lineStyle?.distancePoint ?? 10\n };\n\n let { curve, distancePoint } = styleConfig;\n\n mode = mode || \"quart-in\";\n if (mode !== 'quart-in') {\n curve = curve ?? 10;\n distancePoint = distancePoint ?? 10;\n }\n if (mode === 'quart-in' || points.start.x === points.end.x || points.start.y === points.end.y) {\n this.drawBalancedCurve(dPath, points);\n\n if (mode === 'quart-in') {\n dPath = {} as IAttributeDOnPath;\n this.drawBendBothEndsCurve(dPath, points);\n }\n\n return this.builDAttributeToString(dPath);\n\n }\n const result = this.calculatorDistancePointAndCurve(points, distancePoint, curve, mode);\n\n distancePoint = result.distancePoint;\n curve = result.curve;\n\n this.buildDAttributeByPointEndModeHorizontal(dPath, points, distancePoint || 0, curve || 0, mode);\n this.buildDAttributeByPointEndModeVertical(dPath, points, distancePoint || 0, curve || 0, mode);\n\n return this.builDAttributeToString(dPath);\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-draw-line.mjs","sources":["../../../../../libs-ui/components/draw-line/src/util/calculator-branch.util.ts","../../../../../libs-ui/components/draw-line/src/util/calculator-diretion-element.until.ts","../../../../../libs-ui/components/draw-line/src/util/line-connect-bottom-left.until.ts","../../../../../libs-ui/components/draw-line/src/util/connect-navigation-new-element.util.ts","../../../../../libs-ui/components/draw-line/src/draw-line.directive.ts","../../../../../libs-ui/components/draw-line/src/libs-ui-components-draw-line.ts"],"sourcesContent":["\nexport class MoCanvasCalculatorBranchUtil {\n /**\n * \n * above, left a + b; opposite = true a - b;\n * \n * under, right a - b; opposite = true a + b\n */\n static mathOperatorsCalculation(direction: 'left' | 'right' | 'above' | 'under' | string, a: number | undefined, b: number | undefined, opposite?: boolean) {\n switch (direction) {\n case 'left':\n case 'above':\n if (opposite) {\n return (a ?? 0) - (b ?? 0);\n }\n\n return (a ?? 0) + (b ?? 0);\n\n case 'right':\n case 'under':\n if (opposite) {\n return (a ?? 0) + (b ?? 0);\n }\n\n return (a ?? 0) - (b ?? 0);\n default:\n return (a ?? 0) - (b ?? 0);\n }\n }\n}","import { range } from \"@libs-ui/utils\";\nimport { ICoordinatesSvg, IPoint, IPoints, IRect } from \"../draw-line.interface\";\nimport { MoCanvasCalculatorBranchUtil } from \"./calculator-branch.util\";\nimport { MoCanvasConnectNavigationNewElementUtil } from \"./connect-navigation-new-element.util\";\n\nexport interface IPositionXY { x: number, y: number }\nexport type CornerDirection = 'right-under' | 'under-left' | 'left-above' | 'above-right' | 'under-right' | 'right-above' | 'above-left' | 'left-under'; // theo chiều\nexport class MoCanvasCalculatorDirectionElementUtil {\n static checkUpDownLeftRight(firstPoint: number | undefined, endPoint: number | undefined, direction: 'x' | 'y'): string {\n const distance = ((firstPoint ?? 0) - (endPoint ?? 0));\n\n if (distance === 0) {\n return 'center';\n }\n if (distance > 0) {\n return direction === 'x' ? 'left' : 'above';\n }\n\n return direction === 'x' ? 'right' : 'under';\n }\n\n static drawLineQ(start: { x: number, y: number }, corner: CornerDirection | string, lineCurveX: number, lineCurveY: number) {\n\n const coordQ: ICoordinatesSvg = {};\n\n switch (corner) {\n case 'right-under':\n coordQ.x1 = start.x + lineCurveX;\n coordQ.y1 = start.y;\n coordQ.x = coordQ.x1;\n coordQ.y = coordQ.y1 + lineCurveY;\n break;\n\n case 'under-left':\n coordQ.x1 = start.x;\n coordQ.y1 = start.y + lineCurveY;\n coordQ.x = coordQ.x1 - lineCurveX;\n coordQ.y = coordQ.y1;\n break;\n\n case 'left-above':\n coordQ.x1 = start.x - lineCurveX;\n coordQ.y1 = start.y;\n coordQ.x = coordQ.x1;\n coordQ.y = coordQ.y1 - lineCurveY;\n break;\n\n case 'above-right':\n coordQ.x1 = start.x;\n coordQ.y1 = start.y - lineCurveY;\n coordQ.x = coordQ.x1 + lineCurveX;\n coordQ.y = coordQ.y1;\n break;\n\n case 'under-right':\n coordQ.x1 = start.x;\n coordQ.y1 = start.y + lineCurveY;\n coordQ.x = coordQ.x1 + lineCurveX;\n coordQ.y = coordQ.y1;\n break;\n\n case 'right-above':\n coordQ.x1 = start.x + lineCurveX;\n coordQ.y1 = start.y;\n coordQ.x = coordQ.x1;\n coordQ.y = coordQ.y1 - lineCurveY;\n break;\n\n case 'above-left':\n coordQ.x1 = start.x;\n coordQ.y1 = start.y - lineCurveY;\n coordQ.x = coordQ.x1 - lineCurveX;\n coordQ.y = coordQ.y1;\n break;\n\n case 'left-under':\n coordQ.x1 = start.x - lineCurveX;\n coordQ.y1 = start.y;\n coordQ.x = coordQ.x1;\n coordQ.y = coordQ.y1 + lineCurveY;\n break;\n\n default:\n break;\n }\n\n return coordQ;\n }\n\n /**Tránh khối phía bên phải */\n static byPassElementOnRightSide(startX: number, startY: number, endY: number, lineCurve: number, elementBlockRoad: IRect, directionX: string, separatedPoints: Array<IPoints>, key?: string, coordLX?: number) {\n const topElementBlockRoad = (elementBlockRoad.y ?? 0);\n const bottomElementBlockRoad = (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0);\n const directionY = this.checkUpDownLeftRight(startY, endY, 'y');\n const Q1 = this.drawLineQ({ x: startX, y: startY ?? 0 }, `${directionX}-${directionY === 'under' ? 'under' : 'above'}`, lineCurve, lineCurve);\n const L1 = {\n x: Q1.x ?? 0,\n y: (directionY === 'under' ? bottomElementBlockRoad : topElementBlockRoad)\n };\n\n if (MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {\n if ((directionY === 'under' && bottomElementBlockRoad - (Q1.y ?? 0) <= 0)\n || (directionY === 'above' && topElementBlockRoad - (Q1.y ?? 0) >= 0)) {\n L1.y = Q1.y ?? 0;\n }\n\n if (Math.abs((L1.y ?? 0) - endY) <= 10) {\n L1.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, L1.y, lineCurve);\n }\n }\n const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionY === 'under' ? 'under' : 'above'}-${directionX}`, lineCurve, lineCurve);\n\n const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;\n const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;\n\n separatedPoints.push({ start: { x: coordLX ?? startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'horizontal-single-curve', id: key, name: 'qr' });\n separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y }, mode: 'horizontal', id: key, name: 'lr' });\n separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'vertical-single-curve', id: key, name: 'q2r' });\n\n return {\n pathByPassQ: `${pathQ1} ${pathQ2}`,\n endPath: {\n x: Q2.x ?? 0,\n y: Q2.y ?? 0\n }\n };\n }\n\n /**Tránh khối phía bên trên */\n static byPassElementOnTopBottomSide(startX: number, startY: number, endX: number, lineCurve: number, elementBlockRoad: IRect, directionY: string, separatedPoints: Array<IPoints>, key?: string) {\n const leftElementBlockRoad = (elementBlockRoad.x ?? 0);\n const rightElementBlockRoad = (elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0);\n const directionX = this.checkUpDownLeftRight(startX, endX, 'x') === 'left' ? 'left' : 'right'; // xem nên tránh sang trái hay phải\n\n const Q1 = this.drawLineQ({ x: startX, y: startY ?? 0 }, `${directionY}-${directionX}`, lineCurve, lineCurve);\n const L1 = {\n x: (directionX === 'left' ? leftElementBlockRoad : rightElementBlockRoad),\n y: Q1.y ?? 0\n };\n\n if ((directionX === 'right' && rightElementBlockRoad - (Q1.x ?? 0) <= 0) || (directionX === 'left' && leftElementBlockRoad - (Q1.x ?? 0) >= 0)) {\n L1.x = Q1.x ?? 0;\n }\n const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionX}-${directionY}`, lineCurve, lineCurve);\n\n if (Math.abs((Q2.x ?? 0) - leftElementBlockRoad) <= 10) {\n Q2.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, Q2.x, lineCurve, true);\n }\n\n const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;\n const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'vertical-single-curve', id: key ?? 'qb' });\n separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y ?? 0 }, mode: 'horizontal-single-curve', id: key ?? 'lb' });\n separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y ?? 0 }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'horizontal-single-curve', id: key ?? 'q2b' });\n\n return {\n pathByPassQ: `${pathQ1} ${pathQ2}`,\n endPath: {\n x: Q2.x ?? 0,\n y: Q2.y ?? 0\n }\n };\n }\n\n // kiểm tra đường thẳng và khối có cắt nhau không\n static checkLinePassBlockHorizontal(start: number, end: number, xOrYOfLine: number, direction: 'x' | 'y', obstacleRect: IRect[], returnAllElementBlockRoad?: boolean) {\n const minimumDistanceFromBlock = 8;\n\n start += minimumDistanceFromBlock + 1; // tránh khối xuất phát vào list\n const listPointsOfLine = range(start, end + 1);\n\n const elementBlockRoad = obstacleRect.filter(item => {\n const left = (item.x ?? 0) - minimumDistanceFromBlock;\n const right = (item.x ?? 0) + (item.width ?? 0) + minimumDistanceFromBlock;\n const top = (item.y ?? 0) - minimumDistanceFromBlock;\n const bottom = (item.y ?? 0) + (item.height ?? 0) + minimumDistanceFromBlock;\n\n if (direction === 'x' && listPointsOfLine.find(el => (left <= el && el <= right)) && (top <= xOrYOfLine && xOrYOfLine <= bottom)) {\n return true;\n }\n if (direction === 'y' && listPointsOfLine.find(el => (top <= el && el <= bottom)) && (left <= xOrYOfLine && xOrYOfLine <= right)) {\n return true;\n }\n\n return false;\n });\n\n if (!elementBlockRoad || !elementBlockRoad.length) {\n return undefined;\n }\n\n if (returnAllElementBlockRoad) {\n return elementBlockRoad;\n }\n\n if (direction === 'y') {\n return elementBlockRoad.reduce((a: IRect, b: IRect) => (Math.abs(((a.y ?? 0) - start))) < (Math.abs(((b.y ?? 0) - start))) ? a : b);\n }\n\n return elementBlockRoad.reduce((a: IRect, b: IRect) => (Math.abs(((a.x ?? 0) - start))) < (Math.abs(((b.x ?? 0) - start))) ? a : b);\n }\n\n // kiểm tra hướng thẳng vẽ về điểm end xem có bị chắn bởi khối nào không, nếu có thì phải lùi lại điểm end nhé.\n static checkBlocksElementStraightY(startX: number, startY: number, endPosition: { x: number, y: number }, obstacleRect: IRect[]) {\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect, true) as IRect[];\n\n if (!elementBlockRoad || !elementBlockRoad.length) {\n return;\n }\n\n return elementBlockRoad.reduce((a: IRect, b: IRect) => (Math.abs((a.x ?? 0 - startX))) < (Math.abs((b.x ?? 0 - startX))) ? a : b);\n }\n\n // kiểm tra hướng ngang vẽ về điểm end xem có bị chắn bởi khối nào không, nếu có thì phải lùi lại điểm end nhé.\n static checkBlocksElementX(startX: number, startY: number, endPosition: { x: number, y: number }, obstacleRect: IRect[]) {\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect, true) as IRect[];\n\n if (!elementBlockRoad || !elementBlockRoad.length) {\n return;\n }\n\n return elementBlockRoad.reduce((a: IRect, b: IRect) => (Math.abs(((a.y ?? 0) - startY))) < (Math.abs(((b.y ?? 0) - startY))) ? a : b);\n }\n\n // kiểm tra hướng sang phải là tránh khối\n static checkAndAvoidBlocksLeft(startX: number, startY: number, lineCurve: number, endPosition: IPositionXY, obstacleRect: IRect[], separatedPoints: Array<IPoints>): IPoint {\n const coordLX: IPoint = { x: endPosition.x, y: startY };\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect) as IRect;\n\n if (!elementBlockRoad) {\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '14' });\n\n return coordLX;\n }\n\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');\n const specificXElement = directionX === 'right' ? (elementBlockRoad.x ?? 0) : ((elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0));\n\n coordLX.x = specificXElement + (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) + (lineCurve / 2);\n if (directionX === 'right') {\n coordLX.x = specificXElement - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);\n }\n\n let startXBypassElement = coordLX.x;\n\n if ((directionX === 'left' && startX - (coordLX.x ?? 0) <= 0) || (directionX === 'right' && startX - (coordLX.x ?? 0) >= 0)) {\n coordLX.x = startX;\n startXBypassElement = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, coordLX.x, lineCurve);\n }\n\n let lineByPassBlock: IPoints[] = [];\n let { endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, lineByPassBlock, undefined, coordLX.x);\n\n if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-left' && elementBlockRoad.x + (elementBlockRoad.width) / 2 === endPosition.x && Math.abs(endPosition.y - elementBlockRoad.y) <= 20) { // check xem khối chắn có phải là khối đích hay không?\n lineByPassBlock = [];\n const data = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSideNewMode(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineByPassBlock, undefined, coordLX.x);\n\n endPath = data.endPath;\n }\n separatedPoints.push(...lineByPassBlock);\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '15' });\n const dataEndPath = this.checkAndAvoidBlocksLeft(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);\n\n return dataEndPath;\n }\n\n // kiểm tra hướng sang phải là tránh khối\n static checkAndAvoidBlocks(startX: number, startY: number, lineCurve: number, endPosition: { x: number, y: number }, obstacleRect: IRect[], separatedPoints: Array<IPoints>, pathPre?: string): { path: string, endPath: IPoint } {\n const coordLX: IPoint = { x: endPosition.x - 30, y: startY };\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect) as IRect;\n\n if (!elementBlockRoad) {\n const elementBlockRoadStraightLineY = this.checkBlocksElementStraightY((coordLX.x ?? 0) + 10, coordLX.y ?? 0, endPosition, obstacleRect); // tính điểm end_x dự kiến theo trường hợp đẹp nhất xem nó có chắn bởi khối nào khi kéo xuống không\n\n if (elementBlockRoadStraightLineY && (elementBlockRoadStraightLineY.x ?? 0) > startX) {\n let toX = (elementBlockRoadStraightLineY.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);\n\n if (((elementBlockRoadStraightLineY?.x ?? 0) - startX) < MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT) {\n toX = (elementBlockRoadStraightLineY.x ?? 0) - (((elementBlockRoadStraightLineY?.x ?? 0) - startX) / 2);\n }\n coordLX.x = toX;\n }\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'end' });\n\n return {\n path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,\n endPath: coordLX\n };\n }\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');\n\n coordLX.x = (elementBlockRoad.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);\n\n let separatedPointsByPassElementOnRightSide: Array<IPoints> = [];\n\n const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(coordLX.x, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, separatedPointsByPassElementOnRightSide, 'checkAndAvoidBlocks', coordLX.x);\n let line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;\n\n // tính trước trường hợp sau để lùi line\n const elementBlockRoadPre = this.checkLinePassBlockHorizontal(endPath.x ?? 0, endPosition.x, endPath.y ?? 0, 'x', obstacleRect) as IRect;\n\n if (!elementBlockRoadPre) {\n const elementBlockRoadStraightLineY = this.checkBlocksElementStraightY((endPosition.x ?? 0) + 10, endPath.y ?? 0, endPosition, obstacleRect);\n\n if (elementBlockRoadStraightLineY) {\n const XNew = (elementBlockRoadStraightLineY.x ?? 0) - (MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2) - (lineCurve / 2);\n\n if (XNew < (endPath.x ?? 0)) {\n separatedPointsByPassElementOnRightSide = [];\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'u' });\n\n line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`;\n\n return {\n path: line,\n endPath: coordLX\n };\n }\n }\n }\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsByPassElementOnRightSide);\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'p' });\n const data = this.checkAndAvoidBlocks(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints, `${line}`,);\n\n return {\n path: data.path,\n endPath: data.endPath\n };\n }\n\n // kiểm tra hướng thẳng và tránh khối\n static checkAndAvoidBlocksY(startX: number, startY: number, lineCurve: number, endPosition: { x: number, y: number }, directionY: string, obstacleRect: IRect[], separatedPoints: Array<IPoints>, pathPre?: string): { path: string, endPath: IPoint } {\n const coordLX: IPoint = { x: startX, y: endPosition.y };\n const elementBlockRoad = this.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect) as IRect;\n\n if ((directionY === 'under' && startY > endPosition.y) || (directionY === 'above' && startY < endPosition.y)) {\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'k' });\n\n return {\n path: pathPre ?? '',\n endPath: { x: startX, y: startY }\n };\n }\n if (!elementBlockRoad) {\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'r' });\n\n return {\n path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,\n endPath: coordLX\n };\n }\n\n const y = directionY === 'above' ? (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0) : (elementBlockRoad.y ?? 0);\n\n coordLX.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, y, lineCurve * 2);\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'ra' });\n const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnTopBottomSide(coordLX.x ?? 0, coordLX.y ?? 0, endPosition.x, lineCurve, elementBlockRoad, directionY, separatedPoints);\n\n // sau khi đã tránh thì tiếp tục kéo dài cho tời điểm end x, lại kiểm tra xem có khối nào chắn không?\n const line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y} ${pathByPassQ}` : `L ${coordLX.x} ${coordLX.y} ${pathByPassQ}`;\n const data = this.checkAndAvoidBlocksY(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, `${line}`);\n\n return {\n path: data.path,\n endPath: data.endPath\n };\n }\n\n // kiểm tra hướng thẳng và tránh khối\n static checkAndAvoidBlocksYLeft(startX: number, startY: number, lineCurve: number, endPosition: IPositionXY, directionY: string, obstacleRect: IRect[], separatedPoints: Array<IPoints>, pathPre?: string): { path: string, endPath: IPositionXY } {\n const key = 'checkAndAvoidBlocksYLeft';\n\n const coordLX: IPositionXY = { x: startX, y: endPosition.y };\n const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(startY, endPosition.y, startX, 'y', obstacleRect) as IRect;\n\n if (!elementBlockRoad) {\n const elementBlockRoadStraightLineX = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementX(coordLX.x ?? 0, (coordLX.y ?? 0), endPosition, obstacleRect);\n\n if (elementBlockRoadStraightLineX) {\n const topElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0);\n const bottomElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0) + (elementBlockRoadStraightLineX.height ?? 0);\n\n let toY = (directionY === 'under' ? topElementBlockRoad : bottomElementBlockRoad);\n\n toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, toY, lineCurve * 2);\n\n if (toY > startY && MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {\n coordLX.y = toY;\n }\n }\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: key, name: 'a' });\n\n return {\n path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,\n endPath: coordLX\n };\n }\n\n const y = directionY === 'above' ? (elementBlockRoad.y ?? 0) + (elementBlockRoad.height ?? 0) : (elementBlockRoad.y ?? 0);\n const elementBlockRoadStraightLineX = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementX(coordLX.x ?? 0, (coordLX.y ?? 0), endPosition, obstacleRect);\n let ignoreBypassElement = false;\n\n if (elementBlockRoadStraightLineX && elementBlockRoadStraightLineX.id === elementBlockRoad.id) {\n ignoreBypassElement = true;\n }\n coordLX.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, y, lineCurve * 2);\n\n let separatedPointsByPassElementOnRightSide: Array<IPoints> = [];\n\n const { pathByPassQ, endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnTopBottomSide(coordLX.x ?? 0, coordLX.y ?? 0, endPosition.x, lineCurve, elementBlockRoad, directionY, separatedPointsByPassElementOnRightSide, key);\n let end = coordLX;\n let line = pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`;\n\n separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: key, name: 'b' });\n\n if (ignoreBypassElement) {\n separatedPointsByPassElementOnRightSide = [];\n separatedPoints.push({ start: coordLX, end, mode: 'horizontal', id: key, name: 'c' });\n\n return {\n path: line,\n endPath: end\n };\n }\n\n end = endPath;\n line += ` ${pathByPassQ}`;\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsByPassElementOnRightSide);\n const data = this.checkAndAvoidBlocksYLeft(end.x ?? 0, end.y ?? 0, lineCurve, endPosition, directionY, obstacleRect, separatedPoints, `${line}`);\n\n return {\n path: data.path,\n endPath: data.endPath\n };\n }\n\n static byPassElementOnRightSideNewMode(startX: number, startY: number, endY: number, separatedPoints: Array<IPoints>, key?: string, coordLX?: number) {\n const start = { x: coordLX ?? startX, y: startY };\n const end = { x: (start.x ?? 0) - 20, y: endY };\n\n separatedPoints.push({ start: start, end: end, mode: 'horizontal', id: key, name: 'q2r' });\n\n return {\n pathByPassQ: ``,\n endPath: end\n };\n }\n}","import { cloneDeep } from \"@libs-ui/utils\";\nimport { IPoint, IPoints, IRect } from \"../draw-line.interface\";\nimport { MoCanvasCalculatorBranchUtil } from \"./calculator-branch.util\";\nimport { MoCanvasCalculatorDirectionElementUtil } from \"./calculator-diretion-element.until\";\n\nexport class MoCanvasConnectNavigationBottomLeftElementUtil {\n static lineLeft(pointNext: IRect, pointStart: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPositionOrigin = {\n x: pointNext.x,\n y: pointNext.y\n };\n const endPosition = cloneDeep(endPositionOrigin);\n const directionStartY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, endPositionOrigin.y, 'y');\n\n let newPosition = start;\n\n if (directionStartY === 'above') {\n const startQL = { lx: start.x - lineCurve, ly: (start.y ?? 0) + lineCurve };\n const line = {\n start: { x: (start.x ?? 0), y: start.y ?? 0 },\n end: { x: startQL.lx ?? 0, y: startQL.ly ?? 0 }\n };\n\n newPosition = {\n x: pointStart.x - (lineCurve + 10),\n y: MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, line.end.y, lineCurve, true)\n };\n\n separatedPoints.push({ start: line.start, end: line.end, mode: 'vertical-single-curve', id: '1' }); // line vẽ đi khỏi khối đầu tiên\n separatedPoints.push({ start: line.end, end: newPosition, mode: 'horizontal-single-curve', id: '1' }); // line vẽ đi khỏi khối đầu tiên\n }\n\n // kiểm tra hướng thẳng đến end, nếu có khối thì tránh\n endPositionOrigin.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, endPositionOrigin.y, lineCurve);\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksYLeft(newPosition.x ?? 0, newPosition.y ?? 0, lineCurve, endPositionOrigin, directionStartY, obstacleRect, separatedPoints);\n const directionStartX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x, endPositionOrigin.x, 'x');\n\n if (directionStartX === 'center' && directionStartY === 'under') {\n return;\n }\n\n if (Math.abs((straightLine.endPath.x ?? 0) - endPositionOrigin.x) < lineCurve) {\n const listLine = separatedPoints.filter(item => item.id === 'checkAndAvoidBlocksYLeft');\n const elements = listLine.filter(item => item.start.x === straightLine.endPath.x || item.end.x === straightLine.endPath.x);\n\n elements.forEach(item => {\n if (item.start.x === straightLine.endPath.x) {\n item.start.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartX, item.start.x, (lineCurve));\n }\n if (item.end.x === straightLine.endPath.x) {\n item.end.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartX, item.end.x, (lineCurve));\n }\n });\n }\n\n // // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1\n const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPositionOrigin.x, straightLine.endPath.y ?? 0, 'x', obstacleRect) as IRect;\n const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 },\n `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);\n\n if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {\n coordQ1.x1 = straightLine.endPath.x ?? 0;\n coordQ1.y1 = straightLine.endPath.y ?? 0;\n coordQ1.x = straightLine.endPath.x ?? 0;\n coordQ1.y = straightLine.endPath.y ?? 0;\n }\n\n // kiểm tra và vẽ hướng ngang\n const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPosition.x, 'x');\n const pathHorizontal: IPoints[] = [];\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);\n\n if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {\n separatedPoints.push({ start: straightLine.endPath, end: endPosition, mode: 'vertical', id: '6a ' + directionStartY });\n\n return;\n }\n const end = { x: (coordQ1.x ?? 0), y: coordQ1.y ?? 0 };\n\n separatedPoints.push(...pathHorizontal);\n separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang\n if (endPath.x === endPosition.x && endPath.y < endPosition.y) {\n const itemLast = pathHorizontal.find(item => item.end.x === endPath.x);\n\n if (itemLast) {\n itemLast.end.x = endPosition.x + 50;\n endPath.x = itemLast.end.x;\n }\n }\n separatedPoints.push({ start: endPath, end: { x: pointNext.x, y: pointNext.y }, mode: 'horizontal', id: 'lineEnd' });\n }\n\n static rightLeft(elementNext: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPosition = {\n x: elementNext.x,\n y: elementNext.y\n };\n\n // vẽ 1 đường thẳng từ điểm start ra ngoài đã\n const end = { x: (start.x ?? 0) + 10, y: (start.y ?? 0) + 10 };\n\n separatedPoints.push({ start: { x: (start.x ?? 0), y: start.y ?? 0 }, end: end, mode: 'vertical-single-curve', id: '1' });\n\n const endPositionX = cloneDeep(endPosition);\n\n endPositionX.x -= 50;\n\n let separatedPointsCheckAndAvoidBlocks: Array<IPoints> = [];\n\n let { endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocks(end.x ?? 0, (end.y ?? 0), lineCurve, endPositionX, obstacleRect, separatedPointsCheckAndAvoidBlocks);\n\n if (Math.abs((start.x ?? 0) - endPosition.x) < 10 || end.x > endPath.x) {\n endPath = {\n x: end.x,\n y: end.y\n };\n\n separatedPointsCheckAndAvoidBlocks = [];\n }\n\n if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {\n const element = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === endPath.y && item.end.x === endPath.x));\n const elementQR = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === element?.start.y && item.end.x === element.start.x));\n\n if (element) {\n element.start.y = endPosition.y;\n element.end.y = endPosition.y;\n }\n if (elementQR) {\n elementQR.end.y = endPosition.y;\n }\n }\n\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);\n\n if (endPath.y === endPosition.y) {\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'horizontal' });\n\n return;\n }\n if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'vertical' });\n\n return;\n }\n\n // // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');\n\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const endPositionY = cloneDeep(endPosition);\n\n endPositionY.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, endPositionY.y, lineCurve);\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: { x: coordQ1.x ?? 0, y: (coordQ1.y ?? 0) }, mode: 'horizontal-single-curve', id: 'g' });\n\n let avoidBlocksYLine: IPoints[] = [];\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksY(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionY, directionY, obstacleRect, avoidBlocksYLine);\n\n if (directionY === 'under' && (coordQ1.y ?? 0) > endPositionY.y) {\n avoidBlocksYLine = [];\n straightLine.endPath = { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 };\n }\n if (directionY === 'above' && straightLine.endPath.y <= endPosition.y) {\n avoidBlocksYLine = [];\n straightLine.endPath = { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 };\n }\n if (Math.abs((straightLine.endPath.x ?? 0) - endPosition.x) < 15) {\n const elements = avoidBlocksYLine.filter(item => item.start.x === straightLine.endPath.x || item.end.x === straightLine.endPath.x);\n\n elements.forEach(item => {\n if (item.start.x === straightLine.endPath.x) {\n item.start.x += 30;\n }\n if (item.end.x === straightLine.endPath.x) {\n item.end.x += 30;\n }\n });\n }\n\n separatedPoints.push(...avoidBlocksYLine);\n separatedPoints.push({ start: { x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, end: endPosition, mode: 'vertical-single-curve', id: '4' });\n\n return;\n }\n}","import { cloneDeep } from \"@libs-ui/utils\";\nimport { IPoint, IPoints, IRect } from \"../draw-line.interface\";\nimport { MoCanvasCalculatorBranchUtil } from \"./calculator-branch.util\";\nimport { MoCanvasCalculatorDirectionElementUtil } from \"./calculator-diretion-element.until\";\nimport { MoCanvasConnectNavigationBottomLeftElementUtil } from \"./line-connect-bottom-left.until\";\n\nexport interface IPositionXY { x: number, y: number }\nexport class MoCanvasConnectNavigationNewElementUtil {\n static ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT = 32;\n static START_MODE = 'right-left';\n\n static setXYConnectElements(elementFrom: IRect, elementNext: IRect, obstacleRect: IRect[], separatedPoints: Array<IPoints>, curve: number) {\n this.drawLineConnect(elementFrom, elementNext, obstacleRect, separatedPoints, curve);\n }\n\n static drawLineConnect(elementFrom: IRect, elementNext: IRect, obstacleRect: IRect[], separatedPoints: Array<IPoints>, curve: number) {\n let start_x = (elementFrom.x ?? 0) + (elementFrom.width ?? 0); // điểm out luôn ở phía bên phải\n let start_y = (elementFrom.y ?? 0) + (elementFrom.height ?? 0) / 2; // điểm out luôn ở phía bên phải\n\n if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-top') { // điểm out luôn ở phía bên dưới\n start_x = (elementFrom.x ?? 0) + ((elementFrom.width ?? 0) / 2);\n start_y = (elementFrom.y ?? 0) + (elementFrom.height ?? 0);\n }\n if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-left') { // điểm out luôn ở phía bên dưới\n start_x = (elementFrom.x ?? 0) + ((elementFrom.width ?? 0) / 2);\n start_y = (elementFrom.y ?? 0) + (elementFrom.height ?? 0);\n }\n const M_start: IPoint = { x: start_x, y: start_y };\n\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start_x, elementNext.x, 'x');\n\n switch (MoCanvasConnectNavigationNewElementUtil.START_MODE) {\n case 'right-left':\n if (directionX === 'left') {\n this.lineConnectLeft(elementNext, elementFrom, M_start, curve, obstacleRect, separatedPoints);\n\n return;\n }\n this.lineConnectRight(elementNext, M_start, curve, obstacleRect, separatedPoints);\n break;\n\n case 'bottom-top':\n if (directionX === 'left') {\n this.lineConnectLeftWithBottomStart(elementNext, elementFrom, M_start, curve, obstacleRect, separatedPoints);\n\n return;\n }\n this.lineConnectRightWithBottomStart(elementNext, M_start, curve, obstacleRect, separatedPoints);\n break;\n\n case 'bottom-left':\n console.log(directionX);\n if (directionX === 'left') {\n MoCanvasConnectNavigationBottomLeftElementUtil.lineLeft(elementNext, elementFrom, M_start, curve, obstacleRect, separatedPoints);\n\n return;\n }\n MoCanvasConnectNavigationBottomLeftElementUtil.rightLeft(elementNext, M_start, curve, obstacleRect, separatedPoints);\n break;\n }\n }\n\n private static lineConnectRight(elementNext: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPosition = {\n x: (elementNext.x ?? 0) - (lineCurve * 3),\n y: (elementNext.y ?? 0) + (elementNext.height ?? 0) / 2\n };\n\n const endPositionX = cloneDeep(endPosition);\n\n let separatedPointsCheckAndAvoidBlocks: Array<IPoints> = [];\n let { path, endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocks(start.x ?? 0, start.y ?? 0, lineCurve, endPositionX, obstacleRect, separatedPointsCheckAndAvoidBlocks);\n\n if (Math.abs((start.x ?? 0) - endPosition.x) < 10) {\n path = '';\n endPath = {\n x: start.x,\n y: start.y\n };\n\n separatedPointsCheckAndAvoidBlocks = [];\n }\n\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);\n\n // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');\n\n if (directionY === 'center') {\n const LEnd = { x: elementNext.x ?? 0, y: endPath.y };\n\n separatedPoints.push({ start: endPath, end: LEnd, mode: 'horizontal', id: 'f' });\n\n return {\n dPath: `${path} L ${LEnd.x} ${LEnd.y}`,\n endPath: LEnd\n };\n }\n\n let lineCurveSubY = lineCurve;\n\n if (Math.abs((endPath.y ?? 0) - endPosition.y) < lineCurve * 2) {\n lineCurveSubY = Math.abs((endPath.y ?? 0) - endPosition.y) / 2;\n\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurveSubY * 2, lineCurveSubY); // tính đoạn cong từ đường ngang sang đường thẳng\n const pathQ1 = `Q ${coordQ1.x1},${coordQ1.y1} ${coordQ1.x},${coordQ1.y}`; // từ ngang sang thẳng phải có đường cong\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, `${directionY === 'above' ? 'above' : 'under'}-right`, lineCurveSubY * 2, lineCurveSubY); // tính đoạn cong từ đường thẳng sang ngang\n const pathQ2 = `Q ${coordQ2.x1},${coordQ2.y1} ${coordQ2.x},${coordQ2.y}`;\n\n separatedPoints.push({ start: endPath, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'horizontal-single-curve', id: 'g' });\n separatedPoints.push({ start: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'vertical-single-curve', id: 'j' });\n const lineClose = this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPosition, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: `${path} ${pathQ1} ${pathQ2} ${lineClose}`,\n };\n }\n\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n const pathQ1 = `Q ${coordQ1.x1},${coordQ1.y1} ${coordQ1.x},${coordQ1.y}`; // từ ngang sang thẳng phải có đường cong\n const endPositionY = cloneDeep(endPosition);\n\n endPositionY.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, endPosition.y, lineCurve);\n\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksY(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionY, directionY, obstacleRect, separatedPoints);\n\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionY === 'above' ? 'above' : 'under'}-right`, lineCurve, lineCurve); // tính đoạn cong từ đường thẳng sang ngang\n const pathQ2 = `Q ${coordQ2.x1},${coordQ2.y1} ${coordQ2.x},${coordQ2.y}`; // từ ngang sang thẳng phải có đường cong\n\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'horizontal-single-curve', id: 'g' });\n separatedPoints.push({ start: { x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'vertical-single-curve', id: 'j' });\n const lineClose = this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPosition, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: `${path} ${pathQ1} ${straightLine.path} ${pathQ2} ${lineClose}`,\n endPath: straightLine.endPath\n };\n }\n\n private static lineConnectLeft(elementNext: IRect, elementFrom: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPositionOrigin = {\n x: (elementNext.x ?? 0) - (lineCurve * 1.5),\n y: (elementNext.y ?? 0) + (elementNext.height ?? 0) / 2\n };\n\n const endPosition = cloneDeep(endPositionOrigin);\n const directionStartY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, endPositionOrigin.y, 'y');\n\n const endY = (directionStartY === 'under' || directionStartY === 'center') ? (elementNext.y ?? 0) : (elementNext.y ?? 0) + (elementNext.height ?? 0);\n\n endPosition.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, endY, (lineCurve * 2));\n\n const pathQ = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: (start.x ?? 0) + 10, y: start.y ?? 0 }, `right-${directionStartY === 'under' ? 'under' : 'above'}`, lineCurve, lineCurve);\n const startQL = { lx: pathQ.x, ly: MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, (pathQ.y ?? 0), ((elementFrom.height ?? 0) / 2), true) };\n\n separatedPoints.push({ start: { x: (start.x ?? 0), y: start.y ?? 0 }, end: { x: pathQ.x ?? 0, y: pathQ.y ?? 0 }, mode: 'horizontal-single-curve', id: '1' });\n separatedPoints.push({ start: { x: pathQ.x ?? 0, y: pathQ.y ?? 0 }, end: { x: startQL.lx ?? 0, y: startQL.ly }, mode: 'horizontal', id: '2' });\n\n if (directionStartY === 'center') {\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: startQL.lx ?? 0, y: startQL.ly ?? 0 }, `above-left`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n separatedPoints.push({ start: { x: startQL.lx ?? 0, y: startQL.ly }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '3' });\n\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);\n\n const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');\n\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `left-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'horizontal-single-curve', id: '4' });\n this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksYLeft(startQL.lx ?? 0, startQL.ly ?? 0, lineCurve, endPosition, directionStartY, obstacleRect, separatedPoints);\n\n if (Math.abs((endPosition.x ?? 0) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {\n endPosition.x = straightLine.endPath.x;\n }\n\n if ((directionStartY === 'under' && startQL.ly > endPosition.y) || (directionStartY === 'above' && startQL.ly < endPosition.y) || startQL.ly === endPosition.y) {\n let condition = true;\n\n while (condition) {\n const checkAndAvoidBlocksYLeft = separatedPoints.findIndex(item => item.id === \"checkAndAvoidBlocksYLeft\");\n\n if (checkAndAvoidBlocksYLeft !== -1) {\n separatedPoints.splice(checkAndAvoidBlocksYLeft, 1);\n }\n if (checkAndAvoidBlocksYLeft === -1) {\n condition = false;\n }\n }\n\n straightLine.path = '';\n straightLine.endPath = {\n x: startQL.lx ?? 0,\n y: startQL.ly ?? 0\n };\n }\n\n if (endPosition.x === straightLine.endPath.x) {\n separatedPoints.push({ start: straightLine.endPath, end: endPositionOrigin, mode: 'vertical-single-curve', id: '6a ' + directionStartY });\n this.closeLine({ x: endPositionOrigin.x ?? 0, y: endPositionOrigin.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return;\n }\n\n\n // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1,\n const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPosition.x, straightLine.endPath.y ?? 0, 'x', obstacleRect) as IRect;\n const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);\n\n if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {\n coordQ1.x1 = straightLine.endPath.x ?? 0;\n coordQ1.y1 = straightLine.endPath.y ?? 0;\n coordQ1.x = straightLine.endPath.x ?? 0;\n coordQ1.y = straightLine.endPath.y ?? 0;\n }\n\n separatedPoints.push({ start: straightLine.endPath, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '6a ' + directionStartY });\n\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);\n const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');\n const directionNextY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPath.x, 'x');\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `${directionNextY}-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n separatedPoints.push({ start: endPath, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'horizontal-single-curve', id: '6' });\n\n this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n\n private static closeLine(start: IPositionXY, end: IPositionXY, lineCurve: number, elementNext: IRect, separatedPoints: Array<IPoints>) {\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, end.y, 'y');\n\n if (start.y === end.y) {\n separatedPoints.push({ start, end: { x: elementNext.x ?? 0, y: end.y ?? 0 }, mode: 'horizontal', id: '7' });\n\n return `L ${elementNext.x} ${end.y}`;\n }\n\n const line = { x: start.x, y: start.y };\n const endPoint = {\n x: elementNext.x,\n y: end.y\n };\n let pathQ1 = '';\n\n if (Math.abs(start.y - end.y) > lineCurve) {\n const toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, end.y, lineCurve);\n\n line.y = toY;\n\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(line.x, elementNext.x, 'x');\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: line.x ?? 0, y: line.y ?? 0 }, `${directionY === 'above' ? 'above' : 'under'}-${directionX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n let lineL = '';\n\n if (coordQ1.y === end.y) {\n lineL = `L ${endPoint.x} ${endPoint.y}`;\n }\n\n pathQ1 = `Q ${coordQ1.x1},${coordQ1.y1} ${coordQ1.x},${coordQ1.y} ${lineL}`; // từ ngang sang thẳng phải có đường cong\n }\n\n separatedPoints.push({ start, end: line, mode: 'horizontal', id: '8' });\n separatedPoints.push({ start: line, end: endPoint, mode: 'vertical-single-curve', id: '9' });\n\n return `L ${line.x} ${line.y} ${pathQ1}`;\n }\n\n private static lineConnectLeftWithBottomStart(elementNext: IRect, elementFrom: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPositionOrigin = {\n x: (elementNext.x ?? 0) + (elementNext.width ?? 0) / 2,\n y: (elementNext.y ?? 0) - (lineCurve)\n };\n const endPosition = cloneDeep(endPositionOrigin);\n const directionStartY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, endPositionOrigin.y, 'y');\n const endY = (elementNext.y ?? 0);\n\n console.log('directionStartY', directionStartY);\n if (directionStartY === 'under') {\n endPosition.y = endY - (lineCurve * 3);\n }\n\n const startQL = { lx: start.x, ly: (start.y ?? 0) + lineCurve };\n const line = {\n start: { x: (start.x ?? 0), y: start.y ?? 0 },\n end: { x: startQL.lx ?? 0, y: startQL.ly ?? 0 }\n };\n const newEnd = { x: elementFrom.x - (lineCurve * 2), y: line.end.y - lineCurve };\n\n if (directionStartY === 'above') {\n line.end = { x: (start.x ?? 0) - lineCurve, y: (start.y ?? 0) + (lineCurve * 2) };\n\n separatedPoints.push({ start: line.end, end: newEnd, mode: 'horizontal-single-curve', id: '1' });\n }\n separatedPoints.push({ start: line.start, end: line.end, mode: 'vertical-single-curve', id: '1' }); // line vẽ đi khỏi khối đầu tiên\n const startNewLine = directionStartY === 'above' ? newEnd : line.end;\n\n if (directionStartY === 'center') {\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: startQL.lx ?? 0, y: startQL.ly ?? 0 }, `above-left`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n // từ ngang sang thẳng phải có đường cong\n separatedPoints.push({ start: { x: startQL.lx ?? 0, y: startQL.ly }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '3' });\n\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);\n const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');\n const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `left-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n\n // từ ngang sang thẳng phải có đường cong\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'horizontal-single-curve', id: '4' });\n this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n\n // kiểm tra hướng thẳng đến end, nếu có khối thì tránh\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksYLeft(startNewLine.x ?? 0, startNewLine.y ?? 0, lineCurve, endPosition, directionStartY, obstacleRect, separatedPoints);\n\n const directionStartX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.x, endPositionOrigin.x, 'x');\n\n if (directionStartX === 'center' && directionStartY === 'under') {\n this.closeLineWithLineTopBottom({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``\n };\n }\n\n if ((directionStartY === 'under' && startQL.ly > endPosition.y) || (directionStartY === 'above' && startQL.ly < endPosition.y) || startQL.ly === endPosition.y) {\n let condition = true;\n\n while (condition) {\n const checkAndAvoidBlocksYLeft = separatedPoints.findIndex(item => item.id === \"checkAndAvoidBlocksYLeft\");\n\n if (checkAndAvoidBlocksYLeft !== -1) {\n separatedPoints.splice(checkAndAvoidBlocksYLeft, 1);\n }\n if (checkAndAvoidBlocksYLeft === -1) {\n condition = false;\n }\n }\n\n straightLine.path = '';\n straightLine.endPath = {\n x: startQL.lx ?? 0,\n y: startQL.ly ?? 0\n };\n }\n\n // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1\n const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPosition.x, straightLine.endPath.y ?? 0, 'x', obstacleRect) as IRect;\n const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);\n\n if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {\n coordQ1.x1 = straightLine.endPath.x ?? 0;\n coordQ1.y1 = straightLine.endPath.y ?? 0;\n coordQ1.x = straightLine.endPath.x ?? 0;\n coordQ1.y = straightLine.endPath.y ?? 0;\n }\n\n // kiểm tra và vẽ hướng ngang\n const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPositionOrigin.x, 'x');\n\n endPosition.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionXToEnd, endPosition.x, lineCurve);\n if (Math.abs((coordQ1.y ?? 0) - endPosition.y) <= lineCurve) {\n endPosition.y -= lineCurve;\n }\n const pathHorizontal: IPoints[] = [];\n const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);\n\n if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {\n separatedPoints.push({ start: straightLine.endPath, end: endPositionOrigin, mode: 'vertical', id: '6a ' + directionStartY });\n this.closeLineWithLineTopBottom(endPositionOrigin, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return;\n }\n\n separatedPoints.push(...pathHorizontal);\n separatedPoints.push({ start: straightLine.endPath, end: { x: (coordQ1.x ?? 0 - 10), y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '6a ' + directionStartY });\n this.closeLineWithLineTopBottom({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n\n private static closeLineWithLineTopBottom(start: IPositionXY, end: IPositionXY, lineCurve: number, elementNext: IRect, separatedPoints: Array<IPoints>) {\n const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.x, end.x, 'x');\n\n if (start.x === end.x) {\n separatedPoints.push({ start, end: { x: (elementNext.x ?? 0) + (elementNext.width ?? 0) / 2, y: elementNext.y ?? 0 }, mode: 'horizontal', id: '7' });\n\n return `L ${elementNext.x} ${end.y}`;\n }\n\n const line = { x: start.x, y: start.y };\n const endPoint = {\n x: end.x,\n y: elementNext.y\n };\n const pathQ1 = '';\n\n if (Math.abs(start.x - end.x) > lineCurve) {\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(start.y, endPoint.y, 'y');\n const toX = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, end.x, lineCurve);\n const toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, end.y, lineCurve);\n\n line.x = toX;\n line.y = toY;\n separatedPoints.push({ start: start, end: line, mode: 'vertical-single-curve', id: '9' });\n }\n\n separatedPoints.push({ start: line, end: endPoint, mode: 'horizontal-single-curve', id: '9' });\n\n return `L ${line.x} ${line.y} ${pathQ1}`;\n }\n\n private static lineConnectRightWithBottomStart(elementNext: IRect, start: IPoint, lineCurve: number, obstacleRect: IRect[], separatedPoints: Array<IPoints>) {\n const endPosition = {\n x: (elementNext.x ?? 0) + (elementNext.width ?? 0) / 2,\n y: (elementNext.y ?? 0) - (lineCurve)\n };\n\n // vẽ 1 đường thẳng từ điểm start ra ngoài đã\n const end = { x: (start.x ?? 0) + 10, y: (start.y ?? 0) + 20 };\n\n separatedPoints.push({ start: { x: (start.x ?? 0), y: start.y ?? 0 }, end: end, mode: 'vertical-single-curve', id: '1' });\n\n const endPositionX = cloneDeep(endPosition);\n\n endPositionX.x -= 10;\n\n let separatedPointsCheckAndAvoidBlocks: Array<IPoints> = [];\n let { path, endPath } = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocks(end.x ?? 0, (end.y ?? 0), lineCurve, endPositionX, obstacleRect, separatedPointsCheckAndAvoidBlocks);\n\n if (Math.abs((start.x ?? 0) - endPosition.x) < 10) {\n path = '';\n endPath = {\n x: start.x,\n y: start.y\n };\n\n separatedPointsCheckAndAvoidBlocks = [];\n }\n\n separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);\n\n // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào\n const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');\n\n if (directionY === 'center') {\n const LEnd = { x: elementNext.x ?? 0, y: endPath.y };\n\n separatedPoints.push({ start: endPath, end: LEnd, mode: 'horizontal', id: 'f' });\n\n // đoạn này chưa oce\n this.closeLineWithLineTopBottom(LEnd, endPosition, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: `${path} L ${LEnd.x} ${LEnd.y}`,\n endPath: LEnd\n };\n }\n\n const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng\n const endPositionY = cloneDeep(endPosition);\n\n endPositionY.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, endPosition.y, lineCurve) - 10;\n\n // cần check khi đi thẳng lên có vướng khối nào không để tiến lên\n const elementBlockRoadStraightLineY = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementStraightY((endPath.x ?? 0) + 10, endPath.y ?? 0, endPositionY, obstacleRect);\n\n if (elementBlockRoadStraightLineY) {\n coordQ1.x = (elementBlockRoadStraightLineY.x ?? 0) + (elementBlockRoadStraightLineY.width ?? 0) + lineCurve;\n }\n separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: { x: coordQ1.x ?? 0, y: (coordQ1.y ?? 0) }, mode: 'horizontal-single-curve', id: 'g' });\n\n let avoidBlocksYLine: IPoints[] = [];\n const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksY(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionY, directionY, obstacleRect, avoidBlocksYLine);\n\n if (directionY === 'under' && (coordQ1.y ?? 0) > endPositionY.y) {\n avoidBlocksYLine = [];\n straightLine.endPath = { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 };\n }\n separatedPoints.push(...avoidBlocksYLine);\n this.closeLineWithLineTopBottom({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, endPosition, lineCurve, elementNext, separatedPoints);\n\n return {\n dPath: ``,\n };\n }\n}","import { AfterViewInit, ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, NgZone, OnDestroy, Output, inject } from \"@angular/core\";\nimport { checkMouseOverInContainer, cloneDeep, get, getDragEventByElement } from \"@libs-ui/utils\";\nimport { Subject, takeUntil, tap } from \"rxjs\";\nimport { IAttributeDOnPath, ICircleStyle, IDrawLineDataInput, IMoDrawLineFunctionControl, IPoint, IPoints, IReachablePointRange, IRect, IViewBoxConfig, TYPE_DIRECTION, TYPE_MODE } from \"./draw-line.interface\";\nimport { MoCanvasConnectNavigationNewElementUtil } from \"./util/connect-navigation-new-element.util\";\n\nexport * from \"./draw-line.interface\";\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiComponentsDrawLineDirective]\",\n standalone: true,\n})\nexport class LibsUiComponentsDrawLineDirective implements AfterViewInit, OnDestroy {\n protected cdr = inject(ChangeDetectorRef);\n protected zone = inject(NgZone);\n protected elementRef = inject(ElementRef);\n protected intervalScrollToElement?: number;\n private dataDraw: Array<IDrawLineDataInput> = [];\n private dataReachablePointRange: Array<IReachablePointRange> = [];\n private onDrawLineEnd: Subject<{\n dataLine: IDrawLineDataInput,\n event: MouseEvent\n }> = new Subject();\n private onDestroy = new Subject<void>();\n\n @Input() viewBoxConfig?: IViewBoxConfig;\n @Input() svgElement!: SVGSVGElement;\n @Input() drawRectDebug?: boolean;\n\n @Output() outDrawLineFunctionControl: EventEmitter<IMoDrawLineFunctionControl> = new EventEmitter();\n @Output() outConnected: EventEmitter<{ dataLine: IDrawLineDataInput, dataReachablePointRange: IReachablePointRange }> = new EventEmitter();\n\n\n ngAfterViewInit(): void {\n this.svgElement = this.svgElement || document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n this.elementRef.nativeElement.append(this.svgElement);\n this.outDrawLineFunctionControl.emit({\n setData: this.setData.bind(this),\n setReachablePointRange: this.setReachablePointRange.bind(this),\n removeLine: this.removeLine.bind(this),\n removeReachablePointRange: this.removeReachablePointRange.bind(this),\n updateViewBox: this.updateViewBox.bind(this)\n });\n }\n\n private setData(data: Array<IDrawLineDataInput>) {\n const newData: Array<IDrawLineDataInput> = [];\n\n data.forEach(item => {\n if (this.dataDraw.find(dataDraw => dataDraw.id === item.id && item.points.start.x === dataDraw.points.start.x && item.points.start.y === dataDraw.points.start.y && item.points.end.x === dataDraw.points.end.x && item.points.end.y === dataDraw.points.end.y)) {\n return;\n }\n const itemClone = cloneDeep(item);\n\n itemClone.ref = item;\n newData.push(itemClone);\n });\n\n this.dataDraw.push(...newData);\n this.startProcessDataRow(newData);\n }\n\n\n setReachablePointRange(data: Array<IReachablePointRange>) {\n const newData: Array<IReachablePointRange> = [];\n\n data.forEach(item => {\n if (this.dataReachablePointRange.find(dataDraw => dataDraw.id === item.id || item.x === dataDraw.x && item.y === dataDraw.y)) {\n return;\n }\n const itemClone = cloneDeep(item);\n\n itemClone.ref = item;\n newData.push(itemClone);\n });\n\n this.dataReachablePointRange.push(...newData);\n this.startProcessDataReachablePointRange(newData);\n }\n\n private removeLine(id: string, points?: Array<IPoints>) {\n const dataDrawById = this.dataDraw.filter(item => item.id === id);\n\n if (!dataDrawById?.length) {\n return;\n }\n\n const removeByItem = (item: IDrawLineDataInput) => {\n this.removeElementOfPoints(item.points);\n item.points.separatedPoints?.forEach(separatedPoints => this.removeElementOfPoints(separatedPoints));\n\n };\n\n if (!points?.length) {\n dataDrawById.forEach(item => removeByItem(item));\n this.dataDraw = this.dataDraw.filter(item => item.id !== id);\n this.updateViewBox();\n\n return;\n }\n\n points.forEach(point => {\n const dataDrawRemoveByPoint = dataDrawById.find(item => item.points.start.x === point.start.x && item.points.start.y === point.start.y && item.points.end.x === point.end.x && item.points.end.y === point.end.y);\n\n if (dataDrawRemoveByPoint) {\n dataDrawRemoveByPoint.isRemove = true;\n removeByItem(dataDrawRemoveByPoint);\n this.dataDraw = this.dataDraw.filter(item => item.id !== id && !item.isRemove);\n }\n });\n this.updateViewBox();\n\n }\n\n private removeReachablePointRange(ids: Array<string>) {\n this.clearRect();\n if (!ids.length) {\n return;\n }\n\n ids.forEach(id => {\n const itemRemove = this.dataReachablePointRange?.find(item => item.id === id);\n\n if (!itemRemove) {\n return;\n }\n itemRemove.onDestroyEvent?.next();\n itemRemove.element?.remove();\n this.dataReachablePointRange = this.dataReachablePointRange?.filter(item => item.id !== id);\n });\n }\n\n private startProcessDataRow(dataDraw: Array<IDrawLineDataInput>) {\n this.zone.runOutsideAngular(() => {\n dataDraw.forEach(item => {\n const { pathElement, arrowElement, circleStartElement, circleEndElement } = this.createPathAndArrowElement(item.id);\n\n item.points.obstacleRect?.forEach(data => this.addRect('rect', data));\n item.points.pathElement = pathElement;\n item.points.arrowElement = arrowElement;\n if (item.startCircle) {\n item.points.circleStartElement = circleStartElement;\n this.svgElement.append(circleStartElement);\n }\n if (item.endCircle) {\n item.points.circleEndElement = circleEndElement;\n this.svgElement.append(circleEndElement);\n }\n item.points.onDestroyEvent = new Subject();\n this.drawLine(item);\n });\n this.updateViewBox();\n });\n }\n\n private startProcessDataReachablePointRange(data: Array<IReachablePointRange>) {\n this.zone.runOutsideAngular(() => {\n data.forEach(item => {\n item.onDestroyEvent = new Subject();\n item.element = this.createPathAndArrowElement(item.id).circleEndElement;\n this.svgElement.append(item.element);\n this.updateAttributeCircle(item.element, item.id, item, item.style);\n this.onDrawLineEnd.pipe(takeUntil(item.onDestroyEvent), takeUntil(this.onDestroy)).subscribe(eventData => {\n const { dataLine, event } = eventData;\n\n if (!checkMouseOverInContainer(event, item.element as unknown as HTMLElement) || !dataLine.ref || !item.ref) {\n return;\n }\n\n item.idConnected = eventData.dataLine.id;\n eventData.dataLine.idConnected = item.id;\n this.outConnected.emit({\n dataLine: dataLine.ref,\n dataReachablePointRange: item.ref\n });\n });\n });\n this.updateViewBox();\n });\n }\n\n private removeElementOfPoints(points: IPoints) {\n this.zone.runOutsideAngular(() => {\n points.onDestroyEvent?.next();\n points.onDestroyEvent?.complete();\n points?.pathElement?.remove();\n points?.arrowElement?.remove();\n points?.circleStartElement?.remove();\n points.circleEndElement?.remove();\n });\n }\n\n private drawLine(data: IDrawLineDataInput) {\n this.zone.runOutsideAngular(() => {\n const { points, mode } = data;\n let { curve } = data?.lineStyle || {};\n\n if (mode !== 'quart-in') {\n curve = curve ?? 10;\n }\n const preLengthSeparatedPoints = points.separatedPoints?.length;\n\n points.separatedPoints?.forEach(separatedPoints => this.removeElementOfPoints(separatedPoints));\n points.separatedPoints = [];\n MoCanvasConnectNavigationNewElementUtil.START_MODE = 'right-left';\n if (data.startEndMode) {\n MoCanvasConnectNavigationNewElementUtil.START_MODE = data.startEndMode;\n }\n this.calculatorSeparatedPoints(data.id, points, curve || 10, points.separatedPoints, points.obstacleRect || []);\n if (!preLengthSeparatedPoints && points.separatedPoints.length) {\n this.removeElementOfPoints(points);\n const { pathElement, arrowElement } = this.createPathAndArrowElement(data.id);\n\n points.pathElement = pathElement;\n points.arrowElement = arrowElement;\n points.initialized = false;\n }\n if (!points.separatedPoints?.length) {\n this.buildPathAndDraw(data, points, mode);\n\n return;\n }\n\n let path = '';\n\n points.separatedPoints.forEach(separatedPoints => {\n path += this.buildPathAndDrawSeparatedPoints(data, separatedPoints, separatedPoints.mode || mode);\n });\n const pathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n\n this.svgElement.append(pathElement);\n points.pathElement = pathElement;\n const styleConfig = {\n stroke: data.lineStyle?.stroke ?? '#9CA2AD',\n strokeDasharray: data.lineStyle?.strokeDasharray,\n strokeWidth: data.lineStyle?.strokeWidth ?? '1px',\n fill: data.lineStyle?.fill ?? 'none',\n curve: data.lineStyle?.curve ?? 10,\n distancePoint: data.lineStyle?.distancePoint ?? 10\n };\n\n points.pathElement?.setAttribute('stroke', styleConfig.stroke);\n points.pathElement?.setAttribute('fill', styleConfig.fill);\n points.pathElement?.setAttribute('stroke-width', styleConfig.strokeWidth);\n if (styleConfig.strokeDasharray) {\n points.pathElement?.setAttribute('stroke-dasharray', styleConfig.strokeDasharray)\n }\n points.pathElement?.setAttribute('d', path);\n this.drawRectAndInitEvent(data, mode);\n });\n }\n\n private updateViewBox(viewBoxConfig?: IViewBoxConfig) {\n if (viewBoxConfig) {\n this.viewBoxConfig = viewBoxConfig;\n }\n const xPoints: Set<number> = new Set([0]);\n const yPoints: Set<number> = new Set([0]);\n\n const addPoints = (points: IPoints) => {\n xPoints.add(points.start.x);\n xPoints.add(points.end.x);\n yPoints.add(points.start.y);\n yPoints.add(points.end.y);\n };\n\n this.dataDraw?.forEach(item => {\n const points = item.points;\n\n addPoints(points);\n points.separatedPoints?.forEach(separatedPoints => addPoints(separatedPoints));\n points.obstacleRect?.forEach(obstacleRect => {\n addPoints({\n start: { x: obstacleRect.x - (obstacleRect.gapXObstacleRect || 8), y: obstacleRect.y - (obstacleRect.gapYObstacleRect || 8) },\n end: { x: obstacleRect.x + obstacleRect.width + (obstacleRect.gapXObstacleRect || 8) * 2, y: obstacleRect.y + obstacleRect.height + (obstacleRect.gapYObstacleRect || 8) * 2 }\n });\n });\n });\n\n const xMax = this.viewBoxConfig?.width ?? (xPoints.size ? Math.max(...xPoints) : 0) + 14;\n const yMax = this.viewBoxConfig?.height ?? (yPoints.size ? Math.max(...yPoints) : 0) + 14;\n\n if (!this.viewBoxConfig?.ignoreViewBox) {\n const rectSvgElement = this.svgElement.getBoundingClientRect();\n\n this.svgElement?.setAttribute('viewBox', `${this.viewBoxConfig?.minX ?? rectSvgElement.x} ${this.viewBoxConfig?.minY ?? rectSvgElement.y} ${xMax} ${yMax}`);\n }\n this.svgElement?.setAttribute('width', `${xMax ?? 0}`);\n this.svgElement?.setAttribute('height', `${yMax ?? 0}`);\n }\n\n private isPointInsideSquare(point: IPoint, square: IRect): boolean {\n const { x, y } = point;\n const { x: squareX, y: squareY, width, height } = square;\n\n return x >= squareX && x <= squareX + width && y >= squareY && y <= squareY + height;\n }\n\n private calculatorSeparatedPoints(name: string, points: IPoints, curve: number, separatedPoints: Array<IPoints>, obstacleRects: Array<IRect>) {\n if (!obstacleRects.length) {\n return;\n }\n\n const elementStart = obstacleRects.find(item => this.isPointInsideSquare(points.start, item));\n const elementEnd = obstacleRects.find(item => this.isPointInsideSquare(points.end, item));\n\n if (this.viewBoxConfig?.marginBetweenElement) {\n MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT = this.viewBoxConfig?.marginBetweenElement ?? 32;\n }\n MoCanvasConnectNavigationNewElementUtil.setXYConnectElements(elementStart ?? { ...points.start, width: 1, height: 1 }, elementEnd ?? { ...points.end, width: 1, height: 1 }, obstacleRects, separatedPoints, curve);\n }\n\n private buildPathAndDraw(data: IDrawLineDataInput, points: IPoints, mode?: TYPE_MODE) {\n let dPath = {} as IAttributeDOnPath;\n const styleConfig = {\n stroke: data.lineStyle?.stroke ?? '#9CA2AD',\n strokeDasharray: data.lineStyle?.strokeDasharray,\n strokeWidth: data.lineStyle?.strokeWidth ?? '1px',\n fill: data.lineStyle?.fill ?? 'none',\n curve: data.lineStyle?.curve ?? 10,\n distancePoint: data.lineStyle?.distancePoint ?? 10\n };\n\n points.pathElement?.setAttribute('stroke', styleConfig.stroke);\n points.pathElement?.setAttribute('fill', styleConfig.fill);\n points.pathElement?.setAttribute('stroke-width', styleConfig.strokeWidth);\n if (styleConfig.strokeDasharray) {\n points.pathElement?.setAttribute('stroke-dasharray', styleConfig.strokeDasharray);\n }\n let { curve, distancePoint } = styleConfig;\n\n mode = mode || \"quart-in\";\n if (mode !== 'quart-in') {\n curve = curve ?? 10;\n distancePoint = distancePoint ?? 10;\n }\n if (mode === 'quart-in' || points.start.x === points.end.x || points.start.y === points.end.y) {\n this.drawBalancedCurve(dPath, points);\n\n if (mode === 'quart-in') {\n dPath = {} as IAttributeDOnPath;\n this.drawBendBothEndsCurve(dPath, points);\n }\n points.pathElement?.setAttribute('d', this.builDAttributeToString(dPath));\n this.drawRectAndInitEvent(data, mode);\n\n return;\n }\n const result = this.calculatorDistancePointAndCurve(points, distancePoint, curve, mode);\n\n distancePoint = result.distancePoint;\n curve = result.curve;\n\n this.buildDAttributeByPointEndModeHorizontal(dPath, points, distancePoint || 0, curve || 0, mode);\n this.buildDAttributeByPointEndModeVertical(dPath, points, distancePoint || 0, curve || 0, mode);\n points.pathElement?.setAttribute('d', this.builDAttributeToString(dPath));\n this.drawRectAndInitEvent(data, mode);\n }\n\n private calculatorDistancePointAndCurve(points: IPoints, distancePoint: number, curve: number, mode: TYPE_MODE) {\n if ((!mode.includes('vertical') && !mode.includes('horizontal'))) {\n return { curve, distancePoint };\n }\n const gapX = Math.abs(points.start.x - points.end.x);\n const gapY = Math.abs(points.start.y - points.end.y);\n const multiplierCurve = mode.includes('horizontal') ? 1 : 2;\n const multiplierDistance = mode.includes('horizontal') ? 2 : 1;\n\n if (!mode.includes('single-curve')) {\n if (gapX < distancePoint * multiplierDistance + curve * multiplierCurve) {\n distancePoint = curve = gapX / 3;\n }\n if (gapY < distancePoint * multiplierDistance + curve * multiplierCurve) {\n distancePoint = curve = gapY / 3;\n }\n\n return { curve, distancePoint };\n }\n const minGap = Math.min(gapX, gapY);\n\n if (minGap < distancePoint) {\n distancePoint = minGap;\n }\n if (minGap < curve) {\n curve = minGap;\n }\n\n return { curve, distancePoint };\n }\n\n private drawRectAndInitEvent(data: IDrawLineDataInput, mode: TYPE_MODE) {\n const points = data.points;\n\n this.updateStyleArrow(points, mode, data);\n if (data.startCircle && points.circleStartElement) {\n this.updateAttributeCircle(points.circleStartElement, data.id, points.start, data.startCircleStyle);\n }\n if (data.endCircle && points.circleEndElement) {\n this.updateAttributeCircle(points.circleEndElement, data.id, points.end, data.endCircleStyle);\n }\n this.initEvent(data);\n }\n\n private drawBalancedCurve(dPath: IAttributeDOnPath, points: IPoints) {\n dPath.M = { x: points.start.x, y: points.start.y };\n dPath.Q = [{ x: points.start.x + (points.end.x - points.start.x) / 4, y: points.start.y + (points.end.y - points.start.y) / 2 }, { x: points.start.x + (points.end.x - points.start.x) / 2, y: points.start.y + (points.end.y - points.start.y) / 2 }];\n dPath.Q2 = [{ x: points.end.x - (points.end.x - points.start.x) / 4, y: points.start.y + (points.end.y - points.start.y) / 2 }, { x: points.end.x, y: points.end.y }];\n }\n\n private drawBendBothEndsCurve(dPath: IAttributeDOnPath, points: IPoints) {\n const pointXCurve = (points.start.x + points.end.x) * 0.5;\n const pointControl1 = { x: pointXCurve, y: points.start.y };\n const pointControl2 = { x: pointXCurve, y: points.end.y };\n\n dPath.M = { x: points.start.x, y: points.start.y };\n dPath.C = [{ x: pointControl1.x, y: pointControl1.y }, { x: pointControl2.x, y: pointControl2.y }, { x: points.end.x, y: points.end.y }];\n }\n\n private buildDAttributeByPointEndModeHorizontal(dPath: IAttributeDOnPath, points: IPoints, distancePoint: number, curve: number, mode: TYPE_MODE) {\n if (!mode.includes('horizontal')) {\n return;\n }\n const multiplierX = points.start.x < points.end.x ? -1 : 1;\n const multiplierY = points.start.y < points.end.y ? 1 : -1;\n const reverseMultiplier = -1;\n\n dPath.M = { x: points.start.x, y: points.start.y };\n dPath.L = { x: points.end.x + ((distancePoint * 2 + curve) * multiplierX), y: points.start.y };\n if (mode.includes('horizontal-single')) {\n dPath.L.x = points.end.x + (curve * multiplierX);\n }\n dPath.Q = [{ x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: points.start.y }, { x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: points.start.y + (curve * multiplierY) }];\n dPath.L2 = { x: dPath.Q[1].x, y: points.end.y + (curve * multiplierY * reverseMultiplier) };\n if (mode.includes('horizontal-single')) {\n dPath.L2 = points.end;\n }\n if (mode === 'horizontal') {\n dPath.Q2 = [{ x: dPath.L2.x, y: points.end.y }, { x: dPath.L2.x + (distancePoint * multiplierX * reverseMultiplier), y: points.end.y }];\n dPath.L3 = { x: points.end.x, y: points.end.y };\n }\n }\n\n private buildDAttributeByPointEndModeVertical(dPath: IAttributeDOnPath, points: IPoints, distancePoint: number, curve: number, mode: TYPE_MODE) {\n if (!mode.includes('vertical')) {\n return;\n }\n const multiplierX = points.start.x < points.end.x ? -1 : 1;\n const multiplierY = points.start.y < points.end.y ? 1 : -1;\n const reverseMultiplier = -1;\n\n dPath.M = points.start;\n dPath.L = { x: points.start.x, y: points.start.y + (distancePoint * multiplierY) };\n if (mode.includes('vertical-single')) {\n dPath.L.y = points.end.y + (distancePoint * multiplierY * reverseMultiplier);\n }\n dPath.Q = [{ x: dPath.L.x, y: dPath.L.y + (curve * multiplierY) }, { x: dPath.L.x + (curve * multiplierX * reverseMultiplier), y: dPath.L.y + (curve * multiplierY) }];\n dPath.L2 = { x: points.end.x + ((curve * 2) * multiplierX), y: dPath.Q[1].y };\n if (mode.includes('vertical-single')) {\n dPath.L2 = points.end;\n }\n if (mode === 'vertical') {\n dPath.Q2 = [{ x: points.end.x, y: dPath.L2.y }, { x: points.end.x, y: dPath.L2.y + (curve * multiplierY) }];\n dPath.L3 = { x: points.end.x, y: points.end.y };\n }\n }\n\n private builDAttributeToString(dAttribute: IAttributeDOnPath): string {\n let dString = '';\n\n Object.keys(dAttribute).forEach(key => {\n const data = get(dAttribute, key);\n\n if (Array.isArray(data)) {\n const [point1, point2, point3] = data;\n\n dString = `${dString}${key.replace(/\\d/g, '')}${point1.x},${point1.y} ${point2.x},${point2.y}${point3 ? ' ' + point3.x + ',' + point3.y : ''}\n `;\n\n return;\n }\n dString = `${dString}${key.replace(/\\d/g, '')}${data.x},${data.y}\n `;\n });\n\n return dString;\n }\n\n private updateStyleArrow(points: IPoints, mode: TYPE_MODE, data: IDrawLineDataInput) {\n if (!points.arrowElement || data.ignoreDrawArrow) {\n return;\n }\n const styleConfig = {\n fill: data.arrowStyle?.fill ?? '#9CA2AD',\n stroke: data.arrowStyle?.stroke ?? 'none',\n strokeWidth: data.arrowStyle?.strokeWidth ?? '0',\n width: data.arrowStyle?.width ?? 6,\n height: data.arrowStyle?.height ?? 8\n };\n const pointEnd = cloneDeep(points.end);\n const arrowElement = points.arrowElement;\n const direction = data.arrowDirection || this.getDirection(points, data.startEndMode);\n\n\n\n switch (direction) {\n case 'right':\n if (mode.includes('horizontal') || mode.includes('vertical')) {\n pointEnd.x -= styleConfig.height;\n }\n arrowElement?.setAttribute('points', `${pointEnd.x},${pointEnd.y - styleConfig.width} ${pointEnd.x + styleConfig.height},${pointEnd.y} ${pointEnd.x},${pointEnd.y + styleConfig.width} `);\n break;\n\n case 'left':\n if (mode.includes('horizontal') || mode.includes('vertical')) {\n pointEnd.x += styleConfig.height;\n }\n arrowElement?.setAttribute('points', `${pointEnd.x},${pointEnd.y - styleConfig.width} ${pointEnd.x - styleConfig.height},${pointEnd.y} ${pointEnd.x},${pointEnd.y + styleConfig.width} `);\n break;\n\n case 'top':\n if (mode.includes('horizontal') || mode.includes('vertical')) {\n pointEnd.y += styleConfig.height;\n }\n arrowElement?.setAttribute('points', `${pointEnd.x - styleConfig.width},${pointEnd.y} ${pointEnd.x},${pointEnd.y - styleConfig.height} ${pointEnd.x + styleConfig.width},${pointEnd.y} `);\n break;\n\n case 'bottom':\n if (mode.includes('horizontal') || mode.includes('vertical')) {\n pointEnd.y -= styleConfig.height;\n }\n arrowElement?.setAttribute('points', `${pointEnd.x - styleConfig.width},${pointEnd.y} ${pointEnd.x},${pointEnd.y + styleConfig.height} ${pointEnd.x + styleConfig.width},${pointEnd.y} `);\n break;\n }\n\n arrowElement?.setAttribute('fill', styleConfig.fill);\n arrowElement?.setAttribute('stroke', styleConfig.stroke);\n arrowElement?.setAttribute('stroke-width', styleConfig.strokeWidth);\n }\n\n private updateAttributeCircle(circleElement: SVGCircleElement, name: string, point: { x: number, y: number }, circleStyle?: ICircleStyle) {\n circleElement.setAttribute('name', name);\n circleElement.setAttribute('cx', `${point.x}`);\n circleElement.setAttribute('cy', `${point.y}`);\n circleElement.setAttribute('r', `${circleStyle?.r ?? 2}`);\n circleElement.setAttribute('fill', `${circleStyle?.fill ?? 'green'}`);\n circleElement.setAttribute('stroke', `${circleStyle?.stroke ?? '#9CA2AD'}`);\n circleElement.setAttribute('stroke-width', `${circleStyle?.strokeWidth ?? '1px'}`);\n\n return circleElement;\n }\n\n private getDirection(points: IPoints, startEndMode: 'right-left' | 'bottom-top' | 'bottom-left' | undefined): TYPE_DIRECTION {\n let pointStart = { ...points.start };\n\n if (points.separatedPoints) {\n const lineToEnd = points.separatedPoints.find(item => item.end.x === points.end.x && item.end.y === points.end.y);\n\n if (lineToEnd) {\n pointStart = lineToEnd.start;\n }\n }\n const modeHorizontal = pointStart.x < points.end.x ? 'right' : 'left';\n const modeVertical = pointStart.y < points.end.y ? 'bottom' : 'top';\n\n if (!startEndMode) {\n if (Math.abs(points.end.x - pointStart.x) > Math.abs(points.end.y - pointStart.y)) {\n return modeHorizontal;\n }\n\n return modeVertical;\n }\n\n switch (startEndMode) {\n case 'bottom-left':\n return modeHorizontal;\n\n case 'right-left':\n return modeHorizontal;\n\n case 'bottom-top':\n return modeVertical;\n }\n }\n\n private initEvent(data: IDrawLineDataInput) {\n const points: IPoints = data.points;\n let preEvent: MouseEvent | undefined = undefined;\n\n if ((!points.arrowElement && !points.circleEndElement) || !points.onDestroyEvent || points.initialized) {\n return;\n }\n\n points.initialized = true;\n const functionMouseUp = (mouseEvent: MouseEvent) => {\n if (preEvent) {\n preEvent = undefined;\n this.onDrawLineEnd.next({ dataLine: data, event: mouseEvent });\n }\n }\n\n const handlerDrag = (dragMouseEvent: MouseEvent) => {\n if (!preEvent) {\n preEvent = dragMouseEvent;\n }\n const pointEnd = cloneDeep(points.end);\n\n const movementX = dragMouseEvent.clientX - preEvent.clientX;\n const movementY = dragMouseEvent.clientY - preEvent.clientY;\n\n preEvent = dragMouseEvent;\n pointEnd.x += movementX;\n pointEnd.y += movementY;\n if (data.points?.obstacleRect?.length && data.points?.obstacleRect.some(obstacleRect => this.checkPointIncludeRect(pointEnd, obstacleRect))) {\n\n return;\n }\n points.end.x = pointEnd.x;\n points.end.y = pointEnd.y;\n this.drawLine(data);\n this.updateViewBox();\n };\n\n if (points.arrowElement) {\n getDragEventByElement({\n elementMouseDown:points.arrowElement as unknown as HTMLElement,\n functionMouseUp:functionMouseUp,\n onDestroy:this.onDestroy\n }).pipe(tap(handlerDrag), takeUntil(points.onDestroyEvent)).subscribe();\n }\n\n if (points.circleEndElement) {\n getDragEventByElement({\n elementMouseDown:points.circleEndElement as unknown as HTMLElement,\n functionMouseUp:functionMouseUp,\n onDestroy:this.onDestroy,\n }).pipe(tap(handlerDrag), takeUntil(points.onDestroyEvent)).subscribe();\n }\n }\n\n private checkPointIncludeRect(point: { x: number, y: number }, obstacleRect: IRect): boolean {\n const gapDefault = 8;\n\n obstacleRect = {\n x: obstacleRect.x - (obstacleRect.gapXObstacleRect || gapDefault),\n y: obstacleRect.y - (obstacleRect.gapYObstacleRect || gapDefault),\n width: obstacleRect.width + (obstacleRect.gapXObstacleRect || gapDefault) * 2,\n height: obstacleRect.height + (obstacleRect.gapYObstacleRect || gapDefault) * 2\n };\n if ((obstacleRect.x <= point.x && point.x <= obstacleRect.x + obstacleRect.width) && (obstacleRect.y <= point.y && point.y <= obstacleRect.y + obstacleRect.height)) {\n return true;\n }\n\n return false;\n }\n\n private createPathAndArrowElement(name: string) {\n const pathElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const arrowElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polyline\");\n const circleStartElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n const circleEndElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n\n pathElement.setAttribute('name', name);\n arrowElement.setAttribute('name', name);\n this.svgElement.append(pathElement);\n this.svgElement.append(arrowElement);\n\n return { pathElement, arrowElement, circleStartElement, circleEndElement };\n }\n\n private addCircle(name: string, point: { x: number, y: number }) {\n if (!this.drawRectDebug) {\n return;\n }\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n\n circle.setAttribute('name', name);\n circle.setAttribute('cx', `${point.x}`);\n circle.setAttribute('cy', `${point.y}`);\n circle.setAttribute('r', '2');\n circle.setAttribute('style', 'fill: none; stroke: blue; stroke-width: 1px;');\n this.svgElement.appendChild(circle);\n }\n\n private clearCircle() {\n if (!this.drawRectDebug) {\n return;\n }\n Array.from(this.svgElement.getElementsByTagName('circle'))?.forEach(item => item.remove());\n }\n\n private addRect(name: string, rect: IRect) {\n if (!this.drawRectDebug) {\n return;\n }\n const rectElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n const textElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n\n rectElement.setAttribute('name', name);\n rectElement.setAttribute('x', `${rect.x}`);\n rectElement.setAttribute('y', `${rect.y}`);\n rectElement.setAttribute('width', `${rect.width}`);\n rectElement.setAttribute('height', `${rect.height}`);\n rectElement.setAttribute('style', 'fill: blue; stroke: blue;');\n this.svgElement.appendChild(rectElement);\n\n textElement.setAttribute('x', `${rect.x}`);\n textElement.setAttribute('y', `${rect.y}`);\n textElement.textContent = rect.id ?? '';\n this.svgElement.appendChild(textElement);\n }\n\n private clearRect() {\n if (!this.drawRectDebug) {\n return;\n }\n Array.from(this.svgElement.getElementsByTagName('rect'))?.forEach(item => item.remove());\n Array.from(this.svgElement.getElementsByTagName('text'))?.forEach(item => item.remove());\n }\n\n private buildPathAndDrawSeparatedPoints(data: IDrawLineDataInput, points: IPoints, mode?: TYPE_MODE) {\n let dPath = {} as IAttributeDOnPath;\n const styleConfig = {\n curve: data.lineStyle?.curve ?? 10,\n distancePoint: data.lineStyle?.distancePoint ?? 10\n };\n\n let { curve, distancePoint } = styleConfig;\n\n mode = mode || \"quart-in\";\n if (mode !== 'quart-in') {\n curve = curve ?? 10;\n distancePoint = distancePoint ?? 10;\n }\n if (mode === 'quart-in' || points.start.x === points.end.x || points.start.y === points.end.y) {\n this.drawBalancedCurve(dPath, points);\n\n if (mode === 'quart-in') {\n dPath = {} as IAttributeDOnPath;\n this.drawBendBothEndsCurve(dPath, points);\n }\n\n return this.builDAttributeToString(dPath);\n\n }\n const result = this.calculatorDistancePointAndCurve(points, distancePoint, curve, mode);\n\n distancePoint = result.distancePoint;\n curve = result.curve;\n\n this.buildDAttributeByPointEndModeHorizontal(dPath, points, distancePoint || 0, curve || 0, mode);\n this.buildDAttributeByPointEndModeVertical(dPath, points, distancePoint || 0, curve || 0, mode);\n\n return this.builDAttributeToString(dPath);\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|