@ccpc/snap 0.1.26 → 0.1.28
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.
- package/index.js +1 -0
- package/index.js.map +1 -0
- package/package.json +3 -3
package/index.js
CHANGED
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/snap_type.ts","../src/snap_context.ts","../src/snap_result.ts","../src/point_snap_result.ts","../src/snap_candidates.ts","../src/snap_setting.ts","../src/snap_util.ts","../src/snap_point.ts","../src/snap_direction.ts","../src/snap_engine.ts"],"sourcesContent":["/**\n * 吸附类型\n */\nexport enum EN_SNAP_TYPE {\n /** 无效 */\n InvalidType = -1,\n /** 端点 */\n EndPoint,\n /** 极点 */\n Pole,\n /** 交点 */\n XPt,\n /** 中点 */\n MiddlePoint,\n /** 圆心 */\n Center,\n\n /**\n * 垂足点\n * 确定点 A 后,移动靠近参考线,计算 A 到参考线的垂足\n */\n PerpendicularPoint,\n /** 点在线上 */\n PointOnCurve,\n /** 点在参考线上 */\n ReferCurve,\n /**\n * 延长线上的点\n * 先画线,再移动鼠标到延长线上\n */\n ExtensionPoint,\n /**\n * 垂直方向上的点\n * 确定点 A 后,移动命中曲线,获取 B 使 AB 垂直于曲线\n */\n VerticalToCurve,\n /**\n * 平行于曲线方向上的点\n */\n ParallelToCurve,\n /**\n * 相对上一点,平行于 X 轴\n */\n ParallelToX,\n /**\n * 相对上一点,平行于 Y 轴\n */\n ParallelToY,\n /**\n * 闭合线相对首点平行于 X 轴\n * 已有首点 A,当前点 B 被约束为与 A 水平\n */\n ClosedLineParallelToX,\n /**\n * 闭合线相对首点平行于 Y 轴\n */\n ClosedLineParallelToY,\n /** 点在面上 */\n PointOnFace,\n /** 点在吸附平面上 */\n PointOnSnapPlane,\n}\n","import type { GNode } from '@ccpc/core'\nimport type { Curve2, Vec2 } from '@ccpc/math'\n\nimport type { SnapResult } from './snap_result'\n\n/**\n * 吸附辅助对象类型\n */\nexport enum EN_SNAP_HELP_OBJ {\n POINT = 'point',\n CURVE = 'curve',\n DIR = 'dir',\n}\n\n/**\n * 吸附计算的输入信息,snap引擎根据这些输入信息,计算得到吸附结果\n */\nexport class SnapContext {\n /**\n * pick得到的GNode\n */\n private _snappableGNodes!: GNode[]\n\n /**\n * 当前光标在工作平面上的二维坐标\n */\n private _cursorWorld!: Vec2\n\n /**\n * pickPoint中上一个获取的点,需要吸附平行/延长等方式时,需要设置此项\n */\n private _previousPoint: Vec2 | undefined\n\n /**\n * 画线操作中,上一条线的方向\n */\n private _previousLineDir: Vec2 | undefined\n\n /**\n * 连续取点中,获取的第一个点\n */\n private _firstPoint: Vec2 | undefined\n\n private _snapHelpers: Map<EN_SNAP_HELP_OBJ, (Vec2 | Curve2[])[]> = new Map()\n\n /**\n * 自定义吸附结果排序规则\n */\n private _snapSort: ((a: SnapResult, b: SnapResult) => number) | undefined\n\n constructor()\n\n constructor(snappableGNodes: GNode[], cursorWorld: Vec2)\n\n constructor(snappableGNodes?: GNode[], cursorWorld?: Vec2) {\n if (snappableGNodes && cursorWorld) {\n this._snappableGNodes = snappableGNodes\n this._cursorWorld = cursorWorld\n }\n }\n\n public get snappableGNodes() {\n return this._snappableGNodes\n }\n\n public set snappableGNodes(gnodes: GNode[]) {\n this._snappableGNodes = gnodes\n }\n\n public get cursorWorld() {\n return this._cursorWorld\n }\n\n public set cursorWorld(cursorWorld: Vec2) {\n this._cursorWorld = cursorWorld\n }\n\n public get previousPoint() {\n return this._previousPoint\n }\n\n public set previousPoint(pt: Vec2 | undefined) {\n this._previousPoint = pt\n }\n\n public get previousLineDir() {\n return this._previousLineDir\n }\n\n public set previousLineDir(dir: Vec2 | undefined) {\n this._previousLineDir = dir\n }\n\n public get firstPoint() {\n return this._firstPoint\n }\n\n public set firstPoint(pt: Vec2 | undefined) {\n this._firstPoint = pt\n }\n\n public get snapSort() {\n return this._snapSort\n }\n\n /**\n * Function used to determine the order of the elements.It is expected to return a negative\n * value if first argument is less than second argument, zero if they're equal and a positive value otherwise.\n */\n public set snapSort(snapSort: ((a: SnapResult, b: SnapResult) => number) | undefined) {\n this._snapSort = snapSort\n }\n\n /**\n * 获取某类吸附辅助对象\n */\n public getSnapHelpers(type: EN_SNAP_HELP_OBJ) {\n return this._snapHelpers.get(type)\n }\n\n /**\n * 设置某类吸附辅助对象\n */\n public setSnapHelpers(type: EN_SNAP_HELP_OBJ, snapHelper: (Vec2 | Curve2[])[]) {\n this._snapHelpers.set(type, snapHelper)\n }\n\n /**\n * 添加吸附辅助对象\n */\n public addSnapHelpers(type: EN_SNAP_HELP_OBJ, snapHelper: Vec2[] | Curve2[]) {\n if (!snapHelper.length) {\n return\n }\n\n if (this._snapHelpers.get(type)) {\n if (snapHelper[0].isVector2()) {\n this._snapHelpers.get(type)!.push(...(snapHelper as Vec2[]))\n } else {\n this._snapHelpers.get(type)!.push(snapHelper as Curve2[])\n }\n return\n }\n\n if (snapHelper[0].isVector2()) {\n this.setSnapHelpers(type, snapHelper as Vec2[])\n } else {\n this.setSnapHelpers(type, [snapHelper as Curve2[]])\n }\n }\n}\n","import type { GGroup, GNode } from '@ccpc/core'\r\nimport type { Curve2, Vec2 } from '@ccpc/math'\r\n\r\nimport type { ISnapResult } from './i_snap_result'\r\nimport type { EN_SNAP_TYPE } from './snap_type'\r\n\r\n/**\r\n * 吸附结果基类\r\n */\r\nexport class SnapResult implements ISnapResult {\r\n /**吸附类型*/\r\n private _snapType: EN_SNAP_TYPE\r\n\r\n /**吸附到的GNodes*/\r\n private _snappedGNodes: GNode[]\r\n\r\n /**\r\n * 实际吸附到的几何对象\r\n */\r\n private _snappedObjects: (Curve2 | Vec2)[]\r\n\r\n constructor(snapType: EN_SNAP_TYPE) {\r\n this._snapType = snapType\r\n this._snappedGNodes = []\r\n this._snappedObjects = []\r\n }\r\n\r\n public getSnapType(): EN_SNAP_TYPE {\r\n return this._snapType\r\n }\r\n\r\n public setSnapType(type: EN_SNAP_TYPE) {\r\n this._snapType = type\r\n }\r\n\r\n public getSnappedGNodes(): GNode[] {\r\n return this._snappedGNodes\r\n }\r\n\r\n public setSnappedGNodes(gnodes: GNode[]) {\r\n this._snappedGNodes = gnodes\r\n }\r\n\r\n public addSnappedGNode(snappedGNode: GNode) {\r\n this._snappedGNodes.push(snappedGNode)\r\n }\r\n\r\n public addSnappedGNodes(snappedGNodes: GNode[]) {\r\n this._snappedGNodes.push(...snappedGNodes)\r\n }\r\n\r\n public getSnappedObjects(): (Curve2 | Vec2)[] {\r\n return this._snappedObjects\r\n }\r\n\r\n public setSnappedObjects(objects: (Curve2 | Vec2)[]) {\r\n this._snappedObjects = objects\r\n }\r\n\r\n public addSnappedObject(object: Curve2 | Vec2) {\r\n this._snappedObjects.push(object)\r\n }\r\n\r\n public addSnappedObjects(objects: (Curve2 | Vec2)[]) {\r\n this._snappedObjects.push(...objects)\r\n }\r\n\r\n public getSnapPrompt(): GGroup {\r\n throw new Error('method not implement')\r\n }\r\n}\r\n","import { GCurve2d, GGroup, GPoint2d } from '@ccpc/core'\nimport { Ln2, Plane, Vec2 } from '@ccpc/math'\n\nimport { SnapResult } from './snap_result'\nimport { EN_SNAP_TYPE } from './snap_type'\n\nexport class PtSnap extends SnapResult {\n private _snappedPt: Vec2\n\n private _anotherPt?: Vec2\n\n private _snappedDir?: Vec2\n\n private _disToCursor: number\n\n private _anotherSnapType?: EN_SNAP_TYPE\n\n constructor(\n snapType: EN_SNAP_TYPE,\n snappedPt: Vec2,\n disToCursor: number,\n snappedDir?: Vec2,\n anotherPt?: Vec2,\n ) {\n super(snapType)\n this._snappedPt = snappedPt\n this._disToCursor = disToCursor\n if (anotherPt) {\n this._anotherPt = anotherPt\n }\n if (snappedDir) {\n this._snappedDir = snappedDir\n }\n }\n\n public get snappedPt() {\n return this._snappedPt\n }\n\n public set snappedPt(pt: Vec2) {\n this._snappedPt = pt\n }\n\n public set snappedDir(snappedDir: Vec2 | undefined) {\n this._snappedDir = snappedDir\n }\n\n public get snappedDir() {\n return this._snappedDir\n }\n\n public set anotherSnapType(type: EN_SNAP_TYPE | undefined) {\n this._anotherSnapType = type\n }\n\n public get anotherSnapType() {\n return this._anotherSnapType\n }\n\n public set disToCursor(val: number) {\n this._disToCursor = val\n }\n\n public get disToCursor() {\n return this._disToCursor\n }\n\n // TODO待优化\n public getSnapPrompt(): GGroup {\n const res = new GGroup()\n if (this.getSnapType() === EN_SNAP_TYPE.PointOnSnapPlane) {\n return res\n }\n\n const plane = Plane.XOY()\n const point = new GPoint2d(plane, this._snappedPt.clone())\n point.setStyle({\n point: {\n size: 8,\n color: 0xffffff,\n },\n })\n res.addNode(point)\n\n switch (this.getSnapType()) {\n case EN_SNAP_TYPE.ParallelToX:\n case EN_SNAP_TYPE.ClosedLineParallelToX: {\n if (this._anotherPt) {\n const line = new GCurve2d(plane, new Ln2(this._anotherPt, this._snappedPt))\n line.setStyle({\n line: {\n width: 2,\n color: 0xff0000,\n },\n })\n res.addNode(line)\n }\n break\n }\n case EN_SNAP_TYPE.ParallelToY:\n case EN_SNAP_TYPE.ClosedLineParallelToY: {\n if (this._anotherPt) {\n const line = new GCurve2d(plane, new Ln2(this._anotherPt, this._snappedPt))\n line.setStyle({\n line: {\n width: 2,\n color: 0x00ff00,\n },\n })\n res.addNode(line)\n }\n break\n }\n default:\n break\n }\n\n return res\n }\n\n public getSnapPromptString(): string {\n const getPromptStringByType = (type: EN_SNAP_TYPE) => {\n let text = 'unknown'\n switch (type) {\n case EN_SNAP_TYPE.EndPoint:\n text = '端点'\n break\n case EN_SNAP_TYPE.Pole:\n text = '极点'\n break\n case EN_SNAP_TYPE.XPt:\n text = '交点'\n break\n case EN_SNAP_TYPE.MiddlePoint:\n text = '中点'\n break\n case EN_SNAP_TYPE.Center:\n text = '中心'\n break\n case EN_SNAP_TYPE.PerpendicularPoint:\n text = '垂足'\n break\n case EN_SNAP_TYPE.PointOnCurve:\n text = '边线'\n break\n case EN_SNAP_TYPE.ReferCurve:\n text = '参考线'\n break\n case EN_SNAP_TYPE.ExtensionPoint:\n text = '延长线'\n break\n case EN_SNAP_TYPE.VerticalToCurve:\n text = '垂直于曲线'\n break\n case EN_SNAP_TYPE.ParallelToCurve:\n text = '平行于曲线'\n break\n case EN_SNAP_TYPE.ParallelToX:\n text = '平行X轴'\n break\n case EN_SNAP_TYPE.ParallelToY:\n text = '平行Y轴'\n break\n case EN_SNAP_TYPE.ClosedLineParallelToX:\n text = '平行X轴'\n break\n case EN_SNAP_TYPE.ClosedLineParallelToY:\n text = '平行Y轴'\n break\n case EN_SNAP_TYPE.PointOnFace:\n text = '在面上'\n break\n case EN_SNAP_TYPE.PointOnSnapPlane:\n text = ''\n break\n default:\n break\n }\n return text\n }\n\n return getPromptStringByType(this.getSnapType())\n }\n}\n","import { DebugUtil } from '@ccpc/core'\n\nimport { PtSnap } from './point_snap_result'\nimport type { SnapResult } from './snap_result'\n\n/**\n * 吸附候选结果\n */\nexport class SnapCandidates {\n /**\n * 用于tab切换吸附结果\n */\n private _currentIndex: number\n\n private _snapResults: SnapResult[]\n\n constructor() {\n this._currentIndex = -1\n this._snapResults = []\n }\n\n public get snapResults() {\n return this._snapResults\n }\n\n public addSnapResult(snapResult: SnapResult) {\n this._snapResults.push(snapResult)\n }\n\n public addSnapResults(snapResults: SnapResult[]) {\n this._snapResults.push(...snapResults)\n }\n\n public sort(fun?: (a: SnapResult, b: SnapResult) => number) {\n if (this._snapResults.length < 2) {\n return\n }\n if (fun) {\n this._snapResults.sort(fun)\n return\n }\n\n const getMinType = (c: PtSnap) => {\n if (c.anotherSnapType !== undefined) {\n return Math.min(c.getSnapType(), c.anotherSnapType)\n }\n return c.getSnapType()\n }\n\n const snaps = this._snapResults.filter(_ => _ instanceof PtSnap)\n snaps.sort((a, b) => getMinType(a) - getMinType(b) || a.disToCursor - b.disToCursor)\n this._snapResults = [...snaps]\n }\n\n public getCurrentSnap(): SnapResult | undefined {\n if (this._snapResults.length < 1) {\n return undefined\n }\n return this._snapResults[this.currentIndex]\n }\n\n public get currentIndex() {\n return this._currentIndex\n }\n\n public set currentIndex(index: number) {\n DebugUtil.assert(index < this._snapResults.length && index > -1, 'index不合法', 'wg', '2026-03-25')\n this._currentIndex = index\n }\n}\n","import { DebugUtil } from '@ccpc/core'\n\nexport enum EN_XY {\n X,\n Y,\n}\n\ninterface ISnapSettingState {\n // 捕捉容差\n snapTolerance: number\n // 是否关闭捕捉\n isSnapOff: boolean\n canSnapEndPt: boolean\n canSnapMidPt: boolean\n canSnapCenter: boolean\n // 垂足点\n canSnapPerpendicularPoint: boolean\n // 延长线\n canSnapExtensionPoint: boolean\n // 垂直\n canSnapVertical: boolean\n // 平行于X轴\n canSnapParallelToX: boolean\n // 平行于Y轴\n canSnapParallelToY: boolean\n // 闭合线平行于X轴\n canSnapClosedLineParallelToX: boolean\n // 闭合线平行于Y轴\n canSnapClosedLineParallelToY: boolean\n // 点在线上\n canSnapPointOnCurve: boolean\n // 点在面上\n canSnapPointOnFace: boolean\n // 是否允许捕捉辅助吸附对象\n canSnapHelperObject: boolean\n // 是否允许捕捉辅助吸附方向\n canSnapHelperDir: boolean\n}\n\n/**\n * 捕捉选项设置,为单例类\n * 可用于UI上设置捕捉选项\n */\nexport class SnapSetting {\n private static _instance: SnapSetting\n\n public static instance(): SnapSetting {\n if (!SnapSetting._instance) {\n SnapSetting._instance = new SnapSetting()\n }\n return SnapSetting._instance\n }\n\n private _backup: ISnapSettingState | undefined\n\n // 1个世界单位对应多少像素\n private _pixelsPerUnit: number\n\n // 捕捉容差\n private _snapTolerance: number\n\n // 是否关闭捕捉\n private _isSnapOff: boolean\n\n private _canSnapEndPt!: boolean\n\n private _canSnapMidPt!: boolean\n\n private _canSnapCenter!: boolean\n\n // 垂足点\n private _canSnapPerpendicularPoint!: boolean\n\n // 延长线\n private _canSnapExtensionPoint!: boolean\n\n // 垂直\n private _canSnapVertical!: boolean\n\n // 平行于X轴\n private _canSnapParallelToX!: boolean\n\n // 平行于Y轴\n private _canSnapParallelToY!: boolean\n\n // 闭合线平行于X轴\n private _canSnapClosedLineParallelToX!: boolean\n\n // 闭合线平行于Y轴\n private _canSnapClosedLineParallelToY!: boolean\n\n // 点在线上\n private _canSnapPointOnCurve!: boolean\n\n // 点在面上\n private _canSnapPointOnFace!: boolean\n\n private _canSnapHelperObject!: boolean\n\n private _canSnapHelperDir!: boolean\n\n private constructor() {\n this._snapTolerance = 15\n this._isSnapOff = false\n this._pixelsPerUnit = 1\n this._reset(true)\n }\n\n /**\n * 修改snapSetting前备份原来状态\n */\n public backup() {\n this._backup = {\n snapTolerance: this._snapTolerance,\n isSnapOff: this._isSnapOff,\n canSnapEndPt: this._canSnapEndPt,\n canSnapMidPt: this._canSnapMidPt,\n canSnapCenter: this._canSnapCenter,\n canSnapPerpendicularPoint: this._canSnapPerpendicularPoint,\n canSnapExtensionPoint: this._canSnapExtensionPoint,\n canSnapVertical: this._canSnapVertical,\n canSnapParallelToX: this._canSnapParallelToX,\n canSnapParallelToY: this._canSnapParallelToY,\n canSnapClosedLineParallelToX: this._canSnapClosedLineParallelToX,\n canSnapClosedLineParallelToY: this._canSnapClosedLineParallelToY,\n canSnapPointOnCurve: this._canSnapPointOnCurve,\n canSnapPointOnFace: this._canSnapPointOnFace,\n canSnapHelperObject: this._canSnapHelperObject,\n canSnapHelperDir: this._canSnapHelperDir,\n }\n }\n\n /**\n * 恢复上次备份的snapSetting状态\n */\n public restore() {\n if (!this._backup) {\n return\n }\n this._snapTolerance = this._backup.snapTolerance\n this._isSnapOff = this._backup.isSnapOff\n this._canSnapEndPt = this._backup.canSnapEndPt\n this._canSnapMidPt = this._backup.canSnapMidPt\n this._canSnapCenter = this._backup.canSnapCenter\n this._canSnapPerpendicularPoint = this._backup.canSnapPerpendicularPoint\n this._canSnapExtensionPoint = this._backup.canSnapExtensionPoint\n this._canSnapVertical = this._backup.canSnapVertical\n this._canSnapParallelToX = this._backup.canSnapParallelToX\n this._canSnapParallelToY = this._backup.canSnapParallelToY\n this._canSnapClosedLineParallelToX = this._backup.canSnapClosedLineParallelToX\n this._canSnapClosedLineParallelToY = this._backup.canSnapClosedLineParallelToY\n this._canSnapPointOnCurve = this._backup.canSnapPointOnCurve\n this._canSnapPointOnFace = this._backup.canSnapPointOnFace\n this._canSnapHelperObject = this._backup.canSnapHelperObject\n this._canSnapHelperDir = this._backup.canSnapHelperDir\n delete this._backup\n }\n\n public getSnapTol(): number {\n return this._snapTolerance\n }\n\n // 设置捕捉精度,屏幕像素值\n public setSnapTol(tol: number) {\n this._snapTolerance = tol\n }\n\n public setPixelsPerUnit(pixelsPerUnit: number) {\n this._pixelsPerUnit = pixelsPerUnit\n }\n\n public getPixelsPerUnit() {\n return this._pixelsPerUnit\n }\n\n public getSnapTolInWorld() {\n if (this._pixelsPerUnit <= 0) {\n return this._snapTolerance\n }\n return this._snapTolerance / this._pixelsPerUnit\n }\n\n public get isSnapOff() {\n return this._isSnapOff\n }\n\n public set isSnapOff(val: boolean) {\n this._isSnapOff = val\n }\n\n public allowAll() {\n this._reset(true)\n }\n\n public disableAll() {\n this._reset(false)\n }\n\n public get canSnapEndPt() {\n return this._canSnapEndPt\n }\n\n public set canSnapEndPt(val: boolean) {\n this._canSnapEndPt = val\n }\n\n public get canSnapMidPt() {\n return this._canSnapMidPt\n }\n\n public set canSnapMidPt(val: boolean) {\n this._canSnapMidPt = val\n }\n\n public get canSnapCenter() {\n return this._canSnapCenter\n }\n\n public set canSnapCenter(val: boolean) {\n this._canSnapCenter = val\n }\n\n public get canSnapPerpendicularPoint() {\n return this._canSnapPerpendicularPoint\n }\n\n public set canSnapPerpendicularPoint(val: boolean) {\n this._canSnapPerpendicularPoint = val\n }\n\n public get canSnapExtensionPoint() {\n return this._canSnapExtensionPoint\n }\n\n public set canSnapExtensionPoint(val: boolean) {\n this._canSnapExtensionPoint = val\n }\n\n public get canSnapVertical() {\n return this._canSnapVertical\n }\n\n public set canSnapVertical(val: boolean) {\n this._canSnapVertical = val\n }\n\n public get canSnapHelperObject() {\n return this._canSnapHelperObject\n }\n\n public set canSnapHelperObject(val: boolean) {\n this._canSnapHelperObject = val\n }\n\n public get canSnapHelperDir() {\n return this._canSnapHelperDir\n }\n\n public set canSnapHelperDir(val: boolean) {\n this._canSnapHelperDir = val\n }\n\n public getCanSnapParallelToAxis(axis: EN_XY): boolean {\n switch (axis) {\n case EN_XY.X:\n return this._canSnapParallelToX\n case EN_XY.Y:\n return this._canSnapParallelToY\n default:\n DebugUtil.warn(false, '未定义类型', 'wg', '2026-03-25')\n }\n return false\n }\n\n public setCanSnapParallelToAxis(axis: EN_XY, val: boolean) {\n switch (axis) {\n case EN_XY.X:\n this._canSnapParallelToX = val\n return\n case EN_XY.Y:\n this._canSnapParallelToY = val\n return\n default:\n DebugUtil.warn(false, '未定义类型', 'wg', '2026-03-25')\n }\n }\n\n public getCanSnapClosedLineParallelToAxis(axis: EN_XY): boolean {\n switch (axis) {\n case EN_XY.X:\n return this._canSnapClosedLineParallelToX\n case EN_XY.Y:\n return this._canSnapClosedLineParallelToY\n default:\n DebugUtil.warn(false, '未定义类型', 'wg', '2026-03-25')\n }\n return false\n }\n\n public setCanSnapClosedLineParallelToAxis(axis: EN_XY, val: boolean) {\n switch (axis) {\n case EN_XY.X:\n this._canSnapClosedLineParallelToX = val\n return\n case EN_XY.Y:\n this._canSnapClosedLineParallelToY = val\n return\n default:\n DebugUtil.warn(false, '未定义类型', 'wg', '2026-03-25')\n }\n }\n\n public get canSnapPointOnCurve() {\n return this._canSnapPointOnCurve\n }\n\n public set canSnapPointOnCurve(val: boolean) {\n this._canSnapPointOnCurve = val\n }\n\n public get canSnapPointOnFace() {\n return this._canSnapPointOnFace\n }\n\n public set canSnapPointOnFace(val: boolean) {\n this._canSnapPointOnFace = val\n }\n\n private _reset(val: boolean) {\n this._canSnapEndPt = val\n this._canSnapMidPt = val\n this._canSnapCenter = val\n this._canSnapPerpendicularPoint = val\n this._canSnapExtensionPoint = val\n this._canSnapVertical = val\n this._canSnapParallelToX = val\n this._canSnapParallelToY = val\n this._canSnapClosedLineParallelToX = val\n this._canSnapClosedLineParallelToY = val\n this._canSnapPointOnCurve = val\n this._canSnapPointOnFace = val\n this._canSnapHelperObject = val\n this._canSnapHelperDir = val\n }\n}\n","import { GCurve2d, GNODE_TYPE, GPolygon, GPolycurve, type GNode } from '@ccpc/core'\nimport { Curve2, Vec2, alg } from '@ccpc/math'\n\nimport { PtSnap } from './point_snap_result'\nimport { SnapSetting } from './snap_setting'\nimport { EN_SNAP_TYPE } from './snap_type'\n\n/**\n * 吸附计算公共方法\n */\nexport class SnapUtil {\n /**\n * 点吸附\n */\n public static intersectPoint(cursorWorld: Vec2, pt: Vec2, snapType: EN_SNAP_TYPE) {\n const dis = cursorWorld.distanceTo(pt)\n const tol = SnapSetting.instance().getSnapTolInWorld()\n if (dis > tol) {\n return undefined\n }\n\n return new PtSnap(snapType, pt.clone(), dis)\n }\n\n /**\n * 曲线吸附\n */\n public static intersectCurve(\n cursorWorld: Vec2,\n curve: Curve2,\n snapType: EN_SNAP_TYPE,\n anotherPt?: Vec2,\n ) {\n const footPt = new Vec2()\n const dis = alg.D.ptToCurve2d(cursorWorld, curve, footPt)\n const tol = SnapSetting.instance().getSnapTolInWorld()\n if (dis > tol) {\n return undefined\n }\n\n const ptSnap = new PtSnap(snapType, footPt.clone(), dis, undefined, anotherPt)\n ptSnap.addSnappedObject(curve)\n return ptSnap\n }\n\n public static curveIntersectGNode(curve: Curve2, gnode: GNode) {\n let curves: Curve2[] = []\n if (gnode.getType() === GNODE_TYPE.GCurve2d) {\n curves = [(gnode as GCurve2d).geo]\n } else if (gnode.getType() === GNODE_TYPE.GPolycurve) {\n curves = (gnode as GPolycurve).geo.getAllCurves()\n } else if (gnode.getType() === GNODE_TYPE.GPolygon) {\n curves = (gnode as GPolygon).geo.getAllCurves()\n }\n\n const res: Array<{\n pt: Vec2;\n c: Curve2;\n }> = []\n curves.forEach(c => {\n const intersects = alg.X.curve2ds(curve, c)\n intersects.forEach(p => {\n res.push({\n pt: p.point,\n c,\n })\n })\n })\n return res\n }\n}\n","import { GCurve2d, GPoint2d, GPolygon, GPolycurve, type GNode } from '@ccpc/core'\nimport { alg, type Curve2, type Vec2 } from '@ccpc/math'\n\nimport type { SnapContext } from './snap_context'\nimport { EN_SNAP_HELP_OBJ } from './snap_context'\nimport { PtSnap } from './point_snap_result'\nimport { SnapSetting } from './snap_setting'\nimport { EN_SNAP_TYPE } from './snap_type'\nimport { SnapUtil } from './snap_util'\n\n/**\n * 点吸附计算\n */\nexport class SnapPoint {\n /**\n * 捕捉特征点\n */\n public static snapGPoint(snapContext: SnapContext, snappableGNode: GPoint2d): PtSnap[] {\n const res: PtSnap[] = []\n\n const snapType = (snappableGNode.geo.userData?.snapType ?? EN_SNAP_TYPE.XPt) as EN_SNAP_TYPE\n const ptSnap = SnapUtil.intersectPoint(snapContext.cursorWorld, snappableGNode.geo, snapType)\n if (ptSnap) {\n ptSnap.addSnappedGNode(snappableGNode)\n res.push(ptSnap)\n }\n return res\n }\n\n /**\n * 捕捉两条线的交点\n */\n public static snapCurvesXPoint(snapContext: SnapContext, snappableGNodes: GNode[]): PtSnap[] {\n const res: PtSnap[] = []\n const curveGroups = snappableGNodes\n .map(node => ({\n node,\n curves: this._getNodeCurves(node),\n }))\n .filter(item => item.curves.length > 0)\n\n if (curveGroups.length < 2) {\n return res\n }\n\n const base = curveGroups[0]\n for (let i = 1; i < curveGroups.length; i++) {\n const target = curveGroups[i]\n for (const curve1 of base.curves) {\n for (const curve2 of target.curves) {\n const intersects = alg.X.curve2ds(curve1, curve2)\n for (const intersect of intersects) {\n const ptSnap = SnapUtil.intersectPoint(\n snapContext.cursorWorld,\n intersect.point,\n EN_SNAP_TYPE.XPt,\n )\n if (ptSnap) {\n ptSnap.addSnappedGNode(base.node)\n ptSnap.addSnappedGNode(target.node)\n res.push(ptSnap)\n }\n }\n }\n }\n }\n return res.sort((a, b) => a.disToCursor - b.disToCursor)\n }\n\n /**\n * 捕捉“端点”、“中点”\n */\n public static snapCurveFeaturePoint(snapContext: SnapContext, snappableGNode: GCurve2d | GPolycurve): PtSnap[] {\n let res: PtSnap[] = []\n const snapEndPts = this.snapEndOrMidPoint(snapContext, snappableGNode)\n if (snapEndPts.length > 0) {\n res = snapEndPts\n } else {\n const snapPointOnCurve = this.snapPointOnCurve(snapContext, snappableGNode)\n if (snapPointOnCurve.length > 0) {\n res = snapPointOnCurve\n }\n }\n return res\n }\n\n /**\n * 捕捉参考线\n */\n public static snapReferenceCurve(snapContext: SnapContext): PtSnap[] {\n const res: PtSnap[] = []\n const helpers = snapContext.getSnapHelpers(EN_SNAP_HELP_OBJ.CURVE)\n if (!helpers?.length || !SnapSetting.instance().canSnapHelperObject) {\n return res\n }\n\n const snapHelperCurves: Curve2[][] = []\n for (const snapHelper of helpers) {\n if (Array.isArray(snapHelper) && snapHelper.length && !snapHelper[0].isVector2()) {\n snapHelperCurves.push(snapHelper)\n }\n }\n\n for (const curves of snapHelperCurves) {\n for (const curve of curves) {\n const snapType = (curve.userData?.snapType ?? EN_SNAP_TYPE.ReferCurve) as EN_SNAP_TYPE\n const intersect = SnapUtil.intersectCurve(snapContext.cursorWorld, curve, snapType)\n if (intersect) {\n res.push(intersect)\n return res\n }\n }\n }\n return res\n }\n\n /**\n * 捕捉参考点\n */\n public static snapReferencePoint(snapContext: SnapContext): PtSnap[] {\n const res: PtSnap[] = []\n const helpers = snapContext.getSnapHelpers(EN_SNAP_HELP_OBJ.POINT)\n if (!helpers?.length || !SnapSetting.instance().canSnapHelperObject) {\n return res\n }\n\n const snapHelperPts = helpers.filter(_ => !Array.isArray(_)) as Vec2[]\n for (const pt of snapHelperPts) {\n const snapType = (pt.userData?.snapType ?? EN_SNAP_TYPE.XPt) as EN_SNAP_TYPE\n const intersect = SnapUtil.intersectPoint(snapContext.cursorWorld, pt, snapType)\n if (intersect) {\n res.push(intersect)\n return res\n }\n }\n return res\n }\n\n /**\n * 捕捉“端点”、“中点”\n */\n public static snapEndOrMidPoint(snapContext: SnapContext, snappableGNode: GCurve2d | GPolycurve): PtSnap[] {\n const res: PtSnap[] = []\n const cursorWorld = snapContext.cursorWorld\n\n if (snappableGNode instanceof GCurve2d) {\n const curve = snappableGNode.geo\n\n if (SnapSetting.instance().canSnapEndPt) {\n const startPt = curve.getStartPt()\n let ptSnap = SnapUtil.intersectPoint(cursorWorld, startPt, EN_SNAP_TYPE.EndPoint)\n if (ptSnap) {\n ptSnap.addSnappedGNode(snappableGNode)\n res.push(ptSnap)\n }\n\n const endPt = curve.getEndPt()\n ptSnap = SnapUtil.intersectPoint(cursorWorld, endPt, EN_SNAP_TYPE.EndPoint)\n if (ptSnap) {\n ptSnap.addSnappedGNode(snappableGNode)\n res.push(ptSnap)\n }\n }\n\n if (SnapSetting.instance().canSnapMidPt) {\n const midPt = curve.getMidPt()\n const ptSnap = SnapUtil.intersectPoint(cursorWorld, midPt, EN_SNAP_TYPE.MiddlePoint)\n if (ptSnap) {\n ptSnap.addSnappedGNode(snappableGNode)\n res.push(ptSnap)\n }\n }\n\n return res.sort((a, b) => a.disToCursor - b.disToCursor)\n }\n\n if (snappableGNode instanceof GPolycurve) {\n const curves = snappableGNode.geo.getAllCurves()\n if (!curves.length) {\n return res\n }\n\n if (SnapSetting.instance().canSnapEndPt) {\n const startPt = curves[0].getStartPt()\n const startSnap = SnapUtil.intersectPoint(cursorWorld, startPt, EN_SNAP_TYPE.EndPoint)\n if (startSnap) {\n startSnap.addSnappedGNode(snappableGNode)\n res.push(startSnap)\n }\n\n const endPt = curves[curves.length - 1].getEndPt()\n const endSnap = SnapUtil.intersectPoint(cursorWorld, endPt, EN_SNAP_TYPE.EndPoint)\n if (endSnap) {\n endSnap.addSnappedGNode(snappableGNode)\n res.push(endSnap)\n }\n }\n\n if (SnapSetting.instance().canSnapMidPt) {\n const midCurve = curves[Math.floor(curves.length / 2)]\n const midPt = midCurve.getMidPt()\n const midSnap = SnapUtil.intersectPoint(cursorWorld, midPt, EN_SNAP_TYPE.MiddlePoint)\n if (midSnap) {\n midSnap.addSnappedGNode(snappableGNode)\n res.push(midSnap)\n }\n }\n }\n\n return res.sort((a, b) => a.disToCursor - b.disToCursor)\n }\n\n /**\n * 线上的点\n */\n public static snapPointOnCurve(snapContext: SnapContext, snappableGNode: GCurve2d | GPolycurve): PtSnap[] {\n const res: PtSnap[] = []\n if (!SnapSetting.instance().canSnapPointOnCurve) {\n return res\n }\n\n if (snappableGNode instanceof GCurve2d) {\n const ptSnap = this._snapPtOnCurve(snappableGNode.geo, snapContext, snappableGNode)\n if (ptSnap) {\n res.push(ptSnap)\n }\n return res\n }\n\n if (snappableGNode instanceof GPolycurve) {\n for (const curve of snappableGNode.geo.getAllCurves()) {\n const ptSnap = this._snapPtOnCurve(curve, snapContext, snappableGNode)\n if (ptSnap) {\n res.push(ptSnap)\n return res\n }\n }\n }\n\n return res\n }\n\n /**\n * 面上的点\n */\n public static snapPointOnFace(snapContext: SnapContext, snappableGNode: GPolygon): PtSnap[] {\n const res: PtSnap[] = []\n if (!SnapSetting.instance().canSnapPointOnFace) {\n return res\n }\n\n const pjType = alg.PJ.ptToPolygon(\n snapContext.cursorWorld,\n snappableGNode.geo,\n SnapSetting.instance().getSnapTolInWorld(),\n )\n if (pjType === alg.PtLoopPJType.OUT) {\n return res\n }\n\n const ptSnap = new PtSnap(EN_SNAP_TYPE.PointOnFace, snapContext.cursorWorld.clone(), 0)\n ptSnap.addSnappedGNode(snappableGNode)\n res.push(ptSnap)\n return res\n }\n\n /**\n * 捕捉和曲线的交点\n */\n private static _snapPtOnCurve(curve: Curve2, snapContext: SnapContext, snappableGNode: GNode) {\n const ptSnap = SnapUtil.intersectCurve(snapContext.cursorWorld, curve, EN_SNAP_TYPE.PointOnCurve)\n if (ptSnap) {\n ptSnap.addSnappedGNode(snappableGNode)\n return ptSnap\n }\n return undefined\n }\n\n private static _getNodeCurves(gnode: GNode): Curve2[] {\n if (gnode instanceof GCurve2d) {\n return [gnode.geo]\n }\n if (gnode instanceof GPolycurve) {\n return gnode.geo.getAllCurves()\n }\n if (gnode instanceof GPolygon) {\n return gnode.geo.getAllCurves()\n }\n return []\n }\n}\n","import { CONST, Ln2, Vec2 } from '@ccpc/math'\n\nimport type { SnapContext } from './snap_context'\nimport { EN_SNAP_HELP_OBJ } from './snap_context'\nimport type { PtSnap } from './point_snap_result'\nimport { EN_XY, SnapSetting } from './snap_setting'\nimport { EN_SNAP_TYPE } from './snap_type'\nimport { SnapUtil } from './snap_util'\n\n/**\n * 方向捕捉\n */\nexport class SnapDirection {\n public static snapDirection(snapContext: SnapContext): PtSnap[] {\n const res: PtSnap[] = []\n\n const extensionPt = this.snapExtensionPoint(snapContext)\n if (extensionPt.length > 0) {\n res.push(...extensionPt)\n }\n\n const ptsOnHelperDir = this.snapHelperDirections(snapContext)\n if (ptsOnHelperDir.length > 0) {\n res.push(...ptsOnHelperDir)\n }\n\n const ptsOnVerticalDir = this.snapVerticalDir(snapContext)\n if (ptsOnVerticalDir.length > 0) {\n res.push(...ptsOnVerticalDir)\n }\n\n const ptsParallelToAxis = this.snapPointParallelToAxis(snapContext)\n if (ptsParallelToAxis.length > 0) {\n res.push(...ptsParallelToAxis)\n }\n\n const lastLineParallelToAxis = this.snapLastLineDir(snapContext)\n if (lastLineParallelToAxis.length > 0) {\n res.push(...lastLineParallelToAxis)\n }\n\n return res\n }\n\n /**\n * 捕捉过上一个点的水平/竖直方向\n */\n public static snapPointParallelToAxis(snapContext: SnapContext): PtSnap[] {\n const res: PtSnap[] = []\n if (!snapContext.previousPoint) {\n return res\n }\n\n if (SnapSetting.instance().getCanSnapParallelToAxis(EN_XY.X)) {\n const lineParallelToX = new Ln2(\n snapContext.previousPoint,\n Vec2.X(),\n [-CONST.MODEL_MAX_LENGTH, CONST.MODEL_MAX_LENGTH],\n )\n const ptSnap = SnapUtil.intersectCurve(\n snapContext.cursorWorld,\n lineParallelToX,\n EN_SNAP_TYPE.ParallelToX,\n snapContext.previousPoint,\n )\n if (ptSnap) {\n ptSnap.snappedDir = Vec2.X()\n return [ptSnap]\n }\n }\n\n if (SnapSetting.instance().getCanSnapParallelToAxis(EN_XY.Y)) {\n const lineParallelToY = new Ln2(\n snapContext.previousPoint,\n Vec2.Y(),\n [-CONST.MODEL_MAX_LENGTH, CONST.MODEL_MAX_LENGTH],\n )\n const ptSnap = SnapUtil.intersectCurve(\n snapContext.cursorWorld,\n lineParallelToY,\n EN_SNAP_TYPE.ParallelToY,\n snapContext.previousPoint,\n )\n if (ptSnap) {\n ptSnap.snappedDir = Vec2.Y()\n return [ptSnap]\n }\n }\n\n return res\n }\n\n /**\n * 捕捉延长线上的点\n */\n public static snapExtensionPoint(snapContext: SnapContext): PtSnap[] {\n const res: PtSnap[] = []\n if (!SnapSetting.instance().canSnapExtensionPoint) {\n return res\n }\n if (!snapContext.previousPoint || !snapContext.previousLineDir) {\n return res\n }\n\n const extensionLine = new Ln2(\n snapContext.previousPoint,\n snapContext.previousLineDir,\n [-CONST.MODEL_MAX_LENGTH, CONST.MODEL_MAX_LENGTH],\n )\n const ptSnap = SnapUtil.intersectCurve(\n snapContext.cursorWorld,\n extensionLine,\n EN_SNAP_TYPE.ExtensionPoint,\n )\n if (ptSnap) {\n ptSnap.snappedDir = extensionLine.getDirection()\n return [ptSnap]\n }\n\n return res\n }\n\n /**\n * 捕捉参考方向\n */\n public static snapHelperDirections(snapContext: SnapContext): PtSnap[] {\n const res: PtSnap[] = []\n if (!SnapSetting.instance().canSnapHelperDir) {\n return res\n }\n if (!snapContext.previousPoint || !snapContext.getSnapHelpers(EN_SNAP_HELP_OBJ.DIR)?.length) {\n return res\n }\n\n for (const dir of snapContext.getSnapHelpers(EN_SNAP_HELP_OBJ.DIR)! as Vec2[]) {\n const refLineParallel = new Ln2(\n snapContext.previousPoint,\n dir,\n [-CONST.MODEL_MAX_LENGTH, CONST.MODEL_MAX_LENGTH],\n )\n const ptSnap = SnapUtil.intersectCurve(\n snapContext.cursorWorld,\n refLineParallel,\n (dir.userData?.snapType || EN_SNAP_TYPE.ParallelToCurve) as EN_SNAP_TYPE,\n )\n if (ptSnap) {\n ptSnap.snappedDir = refLineParallel.getDirection()\n ptSnap.addSnappedObject(dir)\n return [ptSnap]\n }\n }\n return res\n }\n\n /**\n * 捕捉和上一个方向垂直的方向\n */\n public static snapVerticalDir(snapContext: SnapContext): PtSnap[] {\n if (!SnapSetting.instance().canSnapVertical) {\n return []\n }\n if (!snapContext.previousPoint || !snapContext.previousLineDir) {\n return []\n }\n\n const newDir = new Vec2(-snapContext.previousLineDir.y, snapContext.previousLineDir.x).normalize()\n const verticalLine = new Ln2(\n snapContext.previousPoint,\n newDir,\n [-CONST.MODEL_MAX_LENGTH, CONST.MODEL_MAX_LENGTH],\n )\n const ptSnap = SnapUtil.intersectCurve(\n snapContext.cursorWorld,\n verticalLine,\n EN_SNAP_TYPE.VerticalToCurve,\n )\n if (ptSnap) {\n ptSnap.snappedDir = newDir\n return [ptSnap]\n }\n return []\n }\n\n /**\n * 连续画线时,捕捉第一点与当前鼠标点连线,与坐标轴平行情况\n */\n public static snapLastLineDir(snapContext: SnapContext): PtSnap[] {\n const res: PtSnap[] = []\n if (\n !snapContext.firstPoint ||\n !snapContext.previousPoint ||\n snapContext.firstPoint.equals(snapContext.previousPoint)\n ) {\n return res\n }\n\n if (SnapSetting.instance().getCanSnapClosedLineParallelToAxis(EN_XY.X)) {\n const lineParallelToX = new Ln2(\n snapContext.firstPoint,\n Vec2.X(),\n [-CONST.MODEL_MAX_LENGTH, CONST.MODEL_MAX_LENGTH],\n )\n const ptSnap = SnapUtil.intersectCurve(\n snapContext.cursorWorld,\n lineParallelToX,\n EN_SNAP_TYPE.ClosedLineParallelToX,\n snapContext.firstPoint,\n )\n if (ptSnap) {\n ptSnap.snappedDir = Vec2.X()\n return [ptSnap]\n }\n }\n\n if (SnapSetting.instance().getCanSnapClosedLineParallelToAxis(EN_XY.Y)) {\n const lineParallelToY = new Ln2(\n snapContext.firstPoint,\n Vec2.Y(),\n [-CONST.MODEL_MAX_LENGTH, CONST.MODEL_MAX_LENGTH],\n )\n const ptSnap = SnapUtil.intersectCurve(\n snapContext.cursorWorld,\n lineParallelToY,\n EN_SNAP_TYPE.ClosedLineParallelToY,\n snapContext.firstPoint,\n )\n if (ptSnap) {\n ptSnap.snappedDir = Vec2.Y()\n return [ptSnap]\n }\n }\n\n return res\n }\n}\n","import { DebugUtil, GCurve2d, GNODE_TYPE, GPoint2d, GPolygon, GPolycurve, type GNode } from '@ccpc/core'\nimport { CONST, Curve2, Ln2, alg } from '@ccpc/math'\n\nimport { PtSnap } from './point_snap_result'\nimport { SnapCandidates } from './snap_candidates'\nimport type { SnapContext } from './snap_context'\nimport { SnapDirection } from './snap_direction'\nimport { SnapPoint } from './snap_point'\nimport { SnapResult } from './snap_result'\nimport { SnapSetting } from './snap_setting'\nimport { EN_SNAP_TYPE } from './snap_type'\nimport { SnapUtil } from './snap_util'\n\n/**\n * snap引擎,根据输入信息,计算得到捕捉结果\n */\nexport class SnapEngine {\n /**\n * 捕捉唯一入口方法\n * @param snapContext 捕捉输入信息\n * @returns 捕捉结果候选集合\n */\n public static snap(snapContext: SnapContext): SnapCandidates {\n DebugUtil.assert(snapContext, 'snapContext不应该为空', 'wg', '2026-03-25')\n\n const res = new SnapCandidates()\n if (SnapSetting.instance().isSnapOff) {\n return res\n }\n\n const snappableGNodes = snapContext.snappableGNodes\n\n // 1. 吸附到最上层的拾取对象\n if (snappableGNodes[0] && snappableGNodes[0].canSnap) {\n const gnode = snappableGNodes[0]\n res.addSnapResults(this._snapGNode(gnode.getType(), snapContext, gnode))\n }\n\n // 2. 吸附辅助对象\n const snapRefPts = SnapPoint.snapReferencePoint(snapContext)\n res.addSnapResults(snapRefPts)\n\n const snapPtOnRefCurve = SnapPoint.snapReferenceCurve(snapContext)\n res.addSnapResults(snapPtOnRefCurve)\n\n // 3. 方向吸附\n const snapDirs = SnapDirection.snapDirection(snapContext)\n res.addSnapResults(snapDirs)\n\n // 4. 交点和组合吸附\n const curvesXs = SnapPoint.snapCurvesXPoint(snapContext, snappableGNodes)\n res.addSnapResults(curvesXs)\n\n const combinedSnaps = this._combineSnaps(snapContext, snapDirs.concat(snapPtOnRefCurve), res.snapResults)\n res.addSnapResults(combinedSnaps)\n\n // 5. 排序\n res.sort(snapContext.snapSort)\n if (res.snapResults.length) {\n return res\n }\n\n // 6. 无吸附结果时,吸附当前工作平面上的点\n const ptSnap = new PtSnap(EN_SNAP_TYPE.PointOnSnapPlane, snapContext.cursorWorld.clone(), 0)\n res.addSnapResult(ptSnap)\n res.sort(snapContext.snapSort)\n return res\n }\n\n private static _snapGNode(gnodeType: GNODE_TYPE, snapContext: SnapContext, originGNode: GNode): PtSnap[] {\n let res: PtSnap[] = []\n switch (gnodeType) {\n case GNODE_TYPE.GPoint2d:\n res = SnapPoint.snapGPoint(snapContext, originGNode as GPoint2d)\n break\n case GNODE_TYPE.GCurve2d:\n res = SnapPoint.snapCurveFeaturePoint(snapContext, originGNode as GCurve2d)\n break\n case GNODE_TYPE.GPolycurve:\n res = SnapPoint.snapCurveFeaturePoint(snapContext, originGNode as GPolycurve)\n break\n case GNODE_TYPE.GPolygon:\n res = SnapPoint.snapPointOnFace(snapContext, originGNode as GPolygon)\n break\n default:\n break\n }\n\n return res\n }\n\n private static _combineIntersects(snapContext: SnapContext, snapDirs: PtSnap[], snaps: SnapResult[]): PtSnap[] {\n const snapRes: PtSnap[] = []\n if (!snapDirs.length || !snaps.length) {\n return snapRes\n }\n\n const getSnapCurve = (tmpSnap: SnapResult): Curve2 | undefined => {\n if (tmpSnap instanceof PtSnap && tmpSnap.snappedPt && tmpSnap.snappedDir) {\n return new Ln2(tmpSnap.snappedPt, tmpSnap.snappedDir, [-CONST.MODEL_MAX_LENGTH, CONST.MODEL_MAX_LENGTH])\n }\n\n const objs = tmpSnap.getSnappedObjects().filter(_ => _ instanceof Curve2)\n if (objs.length === 1) {\n return objs[0]\n }\n return undefined\n }\n\n const isCurveParallel = (c1: Curve2, c2: Curve2) => {\n return c1 instanceof Ln2 && c2 instanceof Ln2 && c1.getDirection().isParallel(c2.getDirection())\n }\n\n const isPerpendicularSnap = (dir: PtSnap, snapCurve: Curve2) => {\n return dir.snappedDir !== undefined &&\n snapCurve instanceof Ln2 &&\n dir.snappedDir.isPerpendicular(snapCurve.getDirection())\n }\n\n for (const dir of snapDirs) {\n const dirCurve = getSnapCurve(dir)\n if (!dirCurve) {\n continue\n }\n\n for (const snap of snaps) {\n if (dir === snap) {\n continue\n }\n\n const type = snap.getSnapType()\n switch (type) {\n case EN_SNAP_TYPE.PointOnCurve: {\n const snappedGNodes = snap.getSnappedGNodes()\n if (snappedGNodes.length !== 1) {\n break\n }\n const intersects = SnapUtil.curveIntersectGNode(dirCurve, snappedGNodes[0])\n for (const intersect of intersects) {\n const res = SnapUtil.intersectPoint(\n snapContext.cursorWorld,\n intersect.pt,\n type,\n )\n if (!res || isCurveParallel(dirCurve, intersect.c)) {\n continue\n }\n if (\n dir.getSnapType() === EN_SNAP_TYPE.VerticalToCurve &&\n dir.snappedDir &&\n intersect.c instanceof Ln2 &&\n dir.snappedDir.isPerpendicular(intersect.c.getDirection())\n ) {\n res.setSnapType(EN_SNAP_TYPE.PerpendicularPoint)\n }\n res.addSnappedGNodes([...dir.getSnappedGNodes(), ...snap.getSnappedGNodes()])\n res.addSnappedObjects([...dir.getSnappedObjects(), ...snap.getSnappedObjects()])\n res.anotherSnapType = dir.getSnapType()\n if (dir.snappedDir) {\n res.snappedDir = dir.snappedDir.clone()\n }\n snapRes.push(res)\n }\n break\n }\n default: {\n const snapCurve = getSnapCurve(snap)\n if (!snapCurve || isCurveParallel(dirCurve, snapCurve)) {\n break\n }\n\n const intersects = alg.X.curve2ds(dirCurve, snapCurve)\n for (const intersect of intersects) {\n const res = SnapUtil.intersectPoint(\n snapContext.cursorWorld,\n intersect.point,\n type,\n )\n if (!res) {\n continue\n }\n\n res.addSnappedGNodes([...dir.getSnappedGNodes(), ...snap.getSnappedGNodes()])\n res.addSnappedObjects([...dir.getSnappedObjects(), ...snap.getSnappedObjects()])\n res.anotherSnapType = dir.getSnapType()\n if (dir.snappedDir) {\n res.snappedDir = dir.snappedDir.clone()\n }\n if (\n dir.getSnapType() === EN_SNAP_TYPE.VerticalToCurve &&\n (!(snap instanceof PtSnap) || !snap.snappedDir) &&\n isPerpendicularSnap(dir, snapCurve)\n ) {\n res.setSnapType(EN_SNAP_TYPE.PerpendicularPoint)\n }\n snapRes.push(res)\n }\n break\n }\n }\n }\n }\n\n return snapRes\n }\n\n /**\n * 组合捕捉结果\n */\n private static _combineSnaps(snapContext: SnapContext, snapDirs: PtSnap[], snaps: SnapResult[]): PtSnap[] {\n const snapRes: PtSnap[] = []\n\n // 组合吸附结果,生成交点\n snapRes.push(...this._combineIntersects(snapContext, snapDirs, snaps))\n\n return snapRes\n }\n}\n"],"names":["EN_SNAP_TYPE","EN_SNAP_HELP_OBJ","SnapContext","snappableGNodes","cursorWorld","gnodes","pt","dir","snapSort","type","snapHelper","SnapResult","snapType","snappedGNode","snappedGNodes","objects","object","PtSnap","snappedPt","disToCursor","snappedDir","anotherPt","val","res","GGroup","plane","Plane","point","GPoint2d","line","GCurve2d","Ln2","text","SnapCandidates","snapResult","snapResults","fun","getMinType","c","snaps","_","a","b","index","DebugUtil","EN_XY","SnapSetting","tol","pixelsPerUnit","axis","SnapUtil","dis","curve","footPt","Vec2","alg","ptSnap","gnode","curves","GNODE_TYPE","SnapPoint","snapContext","snappableGNode","curveGroups","node","item","base","i","target","curve1","curve2","intersects","intersect","snapEndPts","snapPointOnCurve","helpers","snapHelperCurves","snapHelperPts","startPt","endPt","midPt","GPolycurve","startSnap","endSnap","midSnap","GPolygon","SnapDirection","extensionPt","ptsOnHelperDir","ptsOnVerticalDir","ptsParallelToAxis","lastLineParallelToAxis","lineParallelToX","CONST","lineParallelToY","extensionLine","refLineParallel","newDir","verticalLine","SnapEngine","snapRefPts","snapPtOnRefCurve","snapDirs","curvesXs","combinedSnaps","gnodeType","originGNode","snapRes","getSnapCurve","tmpSnap","objs","Curve2","isCurveParallel","c1","c2","isPerpendicularSnap","snapCurve","dirCurve","snap"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ccpc/snap",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.28",
|
|
4
4
|
"description": "Snap interaction layer for editor",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./index.js",
|
|
8
8
|
"types": "./types/index.d.ts",
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@ccpc/core": "^0.1.
|
|
11
|
-
"@ccpc/math": "^0.1.
|
|
10
|
+
"@ccpc/core": "^0.1.28",
|
|
11
|
+
"@ccpc/math": "^0.1.28"
|
|
12
12
|
}
|
|
13
13
|
}
|