Files
Web_FreeCAD_Bitbybit/public/planegcs-browser-worker.js

70 lines
6.0 KiB
JavaScript

import createPlanegcs from '/native/planegcs/freecad-planegcs.js'
let modulePromise
const getModule = () => {
modulePromise ??= createPlanegcs()
return modulePromise
}
self.addEventListener('message', async (event) => {
const { requestId, operation, input } = event.data ?? {}
if (!requestId || !['solve-horizontal-distance', 'solve-vertical-distance', 'solve-distance-x', 'solve-distance-y', 'solve-angle', 'solve-circle-radius', 'solve-circle-diameter', 'solve-equal-lines', 'solve-equal-circles', 'solve-tangent-circles', 'solve-point-symmetry', 'solve-point-on-line', 'solve-point-on-circle', 'solve-point-on-arc', 'solve-point-on-ellipse', 'solve-point-on-cubic-bspline', 'solve-cubic-bspline-weight', 'solve-parallel-lines', 'solve-perpendicular-lines', 'solve-coincident-lines', 'solve-coincident-line-points', 'solve-snells-law-lines', 'solve-ellipse-internal-alignment'].includes(operation)) {
self.postMessage({ requestId, ok: false, error: 'Unsupported planegcs Worker request.' })
return
}
try {
const module = await getModule()
const result = operation === 'solve-vertical-distance'
? module.solveVerticalDistance(input.startX, input.startY, input.endX, input.endY, input.targetLength)
: operation === 'solve-distance-x'
? module.solveDistanceX(input.startX, input.startY, input.endX, input.endY, input.targetDistance)
: operation === 'solve-distance-y'
? module.solveDistanceY(input.startX, input.startY, input.endX, input.endY, input.targetDistance)
: operation === 'solve-angle'
? module.solveAngle(input.startX, input.startY, input.endX, input.endY, input.targetLength, input.targetAngle)
: operation === 'solve-circle-radius'
? module.solveCircleRadius(input.centerX, input.centerY, input.radius, input.targetRadius)
: operation === 'solve-circle-diameter'
? module.solveCircleDiameter(input.centerX, input.centerY, input.radius, input.targetDiameter)
: operation === 'solve-equal-lines'
? module.solveEqualLines(input.firstStartX, input.firstStartY, input.firstEndX, input.firstEndY, input.secondStartX, input.secondStartY, input.secondEndX, input.secondEndY)
: operation === 'solve-equal-circles'
? module.solveEqualCircles(input.firstCenterX, input.firstCenterY, input.firstRadius, input.secondCenterX, input.secondCenterY, input.secondRadius)
: operation === 'solve-tangent-circles'
? module.solveTangentCircles(input.firstCenterX, input.firstCenterY, input.firstRadius, input.secondCenterX, input.secondCenterY, input.secondRadius)
: operation === 'solve-point-symmetry'
? module.solvePointSymmetry(input.firstX, input.firstY, input.secondX, input.secondY, input.centerX, input.centerY)
: operation === 'solve-point-on-line'
? module.solvePointOnLine(input.pointX, input.pointY, input.startX, input.startY, input.endX, input.endY, input.vertical)
: operation === 'solve-point-on-circle'
? module.solvePointOnCircle(input.pointX, input.pointY, input.centerX, input.centerY, input.radius)
: operation === 'solve-point-on-arc'
? module.solvePointOnArc(input.pointX, input.pointY, input.centerX, input.centerY, input.radius, input.startAngle, input.endAngle)
: operation === 'solve-point-on-ellipse'
? module.solvePointOnEllipse(input.pointX, input.pointY, input.centerX, input.centerY, input.focusX, input.focusY, input.minorRadius)
: operation === 'solve-point-on-cubic-bspline'
? module.solvePointOnCubicBspline(input.pointX, input.pointY, input.pole0X, input.pole0Y, input.pole1X, input.pole1Y, input.pole2X, input.pole2Y, input.pole3X, input.pole3Y, input.pointParameter)
: operation === 'solve-cubic-bspline-weight'
? module.solveCubicBsplineWeight(input.pole0X, input.pole0Y, input.pole1X, input.pole1Y, input.pole2X, input.pole2Y, input.pole3X, input.pole3Y, input.weight0, input.weight1, input.weight2, input.weight3, input.controlPointIndex, input.targetWeight)
: operation === 'solve-parallel-lines'
? module.solveParallelLines(input.firstStartX, input.firstStartY, input.firstEndX, input.firstEndY, input.secondStartX, input.secondStartY, input.secondEndX, input.secondEndY, input.secondLength)
: operation === 'solve-coincident-lines'
? module.solveCoincidentLines(input.firstStartX, input.firstStartY, input.firstEndX, input.firstEndY, input.secondStartX, input.secondStartY, input.secondEndX, input.secondEndY, input.secondLength)
: operation === 'solve-coincident-line-points'
? module.solveCoincidentLinePoints(input.firstStartX, input.firstStartY, input.firstEndX, input.firstEndY, input.secondStartX, input.secondStartY, input.secondEndX, input.secondEndY, input.secondLength, input.firstEnd, input.secondEnd)
: operation === 'solve-snells-law-lines'
? module.solveSnellsLawLines(input.firstStartX, input.firstStartY, input.firstEndX, input.firstEndY, input.secondStartX, input.secondStartY, input.secondEndX, input.secondEndY, input.boundaryStartX, input.boundaryStartY, input.boundaryEndX, input.boundaryEndY, input.refractiveRatio, input.firstEnd, input.secondEnd)
: operation === 'solve-ellipse-internal-alignment'
? module.solveEllipseInternalAlignment(input.centerX, input.centerY, input.majorRadius, input.minorRadius, input.rotation, input.alignmentType)
: operation === 'solve-perpendicular-lines'
? module.solvePerpendicularLines(input.firstStartX, input.firstStartY, input.firstEndX, input.firstEndY, input.secondStartX, input.secondStartY, input.secondEndX, input.secondEndY, input.secondLength)
: module.solveHorizontalDistance(input.startX, input.startY, input.endX, input.endY, input.targetLength)
const values = Array.from({ length: result.size() }, (_, index) => result.get(index))
result.delete()
self.postMessage({ requestId, ok: true, values })
} catch (error) {
self.postMessage({ requestId, ok: false, error: error instanceof Error ? `${error.name}: ${error.message}` : String(error) })
}
})