add Parallel helper (#60)
This commit is contained in:
@ -22,6 +22,7 @@
|
||||
"react-json-view": "^1.21.3",
|
||||
"react-modal-promise": "^1.0.2",
|
||||
"react-scripts": "5.0.1",
|
||||
"sketch-helpers": "^0.0.1",
|
||||
"swr": "^2.0.4",
|
||||
"three": "^0.146.0",
|
||||
"typescript": "^4.4.2",
|
||||
|
@ -477,8 +477,24 @@ function executePipeBody(
|
||||
|
||||
function executeObjectExpression(
|
||||
_programMemory: ProgramMemory,
|
||||
objExp: ObjectExpression
|
||||
objExp: ObjectExpression,
|
||||
pipeInfo: {
|
||||
isInPipe: boolean
|
||||
previousResults: any[]
|
||||
expressionIndex: number
|
||||
body: PipeExpression['body']
|
||||
sourceRangeOverride?: SourceRange
|
||||
} = {
|
||||
isInPipe: false,
|
||||
previousResults: [],
|
||||
expressionIndex: 0,
|
||||
body: [],
|
||||
}
|
||||
) {
|
||||
const _pipeInfo = {
|
||||
...pipeInfo,
|
||||
isInPipe: false,
|
||||
}
|
||||
const obj: { [key: string]: any } = {}
|
||||
objExp.properties.forEach((property) => {
|
||||
if (property.type === 'ObjectProperty') {
|
||||
@ -504,6 +520,18 @@ function executeObjectExpression(
|
||||
} else if (property.value.type === 'ArrayExpression') {
|
||||
const result = executeArrayExpression(_programMemory, property.value)
|
||||
obj[property.key.name] = result
|
||||
} else if (property.value.type === 'CallExpression') {
|
||||
obj[property.key.name] = executeCallExpression(
|
||||
_programMemory,
|
||||
property.value,
|
||||
[],
|
||||
_pipeInfo
|
||||
)
|
||||
} else if (property.value.type === 'UnaryExpression') {
|
||||
obj[property.key.name] = getUnaryExpressionResult(
|
||||
property.value,
|
||||
_programMemory
|
||||
)
|
||||
} else {
|
||||
throw new Error(
|
||||
`Unexpected property type ${property.value.type} in object expression`
|
||||
@ -613,7 +641,7 @@ function executeCallExpression(
|
||||
)
|
||||
return result
|
||||
} else if (arg.type === 'ObjectExpression') {
|
||||
return executeObjectExpression(programMemory, arg)
|
||||
return executeObjectExpression(programMemory, arg, _pipeInfo)
|
||||
} else if (arg.type === 'UnaryExpression') {
|
||||
return getUnaryExpressionResult(arg, programMemory, _pipeInfo)
|
||||
} else if (arg.type === 'BinaryExpression') {
|
||||
|
26
src/lang/std/std.test.ts
Normal file
26
src/lang/std/std.test.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import { abstractSyntaxTree } from '../abstractSyntaxTree'
|
||||
import { executor } from '../executor'
|
||||
import { lexer } from '../tokeniser'
|
||||
import { initPromise } from '../rust'
|
||||
|
||||
beforeAll(() => initPromise)
|
||||
|
||||
describe('testing angledLineThatIntersects', () => {
|
||||
it('angledLineThatIntersects should intersect with another line', () => {
|
||||
const code = (offset: string) => `const part001 = startSketchAt([0, 0])
|
||||
|> lineTo({to:[2, 2], tag: "yo"}, %)
|
||||
|> lineTo([3, 1], %)
|
||||
|> angledLineThatIntersects({
|
||||
angle: 180,
|
||||
intersectTag: 'yo',
|
||||
offset: ${offset},
|
||||
tag: "yo2"
|
||||
}, %)
|
||||
const intersect = segEndX('yo2', part001)
|
||||
show(part001)`
|
||||
const { root } = executor(abstractSyntaxTree(lexer(code('-1'))))
|
||||
expect(root.intersect.value).toBe(1 + Math.sqrt(2))
|
||||
const { root: noOffset } = executor(abstractSyntaxTree(lexer(code('0'))))
|
||||
expect(noOffset.intersect.value).toBeCloseTo(1)
|
||||
})
|
||||
})
|
@ -12,6 +12,7 @@ import {
|
||||
angledLineToY,
|
||||
closee,
|
||||
startSketchAt,
|
||||
getCoordsFromPaths,
|
||||
} from './sketch'
|
||||
import {
|
||||
segLen,
|
||||
@ -27,6 +28,7 @@ import { Quaternion, Vector3 } from 'three'
|
||||
import { SketchGroup, ExtrudeGroup, Position, Rotation } from '../executor'
|
||||
|
||||
import { InternalFn, InternalFnNames, InternalFirstArg } from './stdTypes'
|
||||
import { intersectionWithParallelLine } from 'sketch-helpers'
|
||||
|
||||
const transform: InternalFn = <T extends SketchGroup | ExtrudeGroup>(
|
||||
{ sourceRange }: InternalFirstArg,
|
||||
@ -79,6 +81,38 @@ const translate: InternalFn = <T extends SketchGroup | ExtrudeGroup>(
|
||||
}
|
||||
}
|
||||
|
||||
const angledLineThatIntersects: InternalFn = (
|
||||
{ sourceRange, programMemory },
|
||||
data: {
|
||||
angle: number
|
||||
intersectTag: string
|
||||
offset?: number
|
||||
tag?: string
|
||||
},
|
||||
previousSketch: SketchGroup
|
||||
) => {
|
||||
if (!previousSketch) throw new Error('lineTo must be called after lineTo')
|
||||
const intersectPath = previousSketch.value.find(
|
||||
({ name }) => name === data.intersectTag
|
||||
)
|
||||
if (!intersectPath) throw new Error('intersectTag must match a line')
|
||||
const from = getCoordsFromPaths(
|
||||
previousSketch,
|
||||
previousSketch.value.length - 1
|
||||
)
|
||||
const to = intersectionWithParallelLine({
|
||||
line1: [intersectPath.from, intersectPath.to],
|
||||
line1Offset: data.offset || 0,
|
||||
line2Point: from,
|
||||
line2Angle: data.angle,
|
||||
})
|
||||
return lineTo.fn(
|
||||
{ sourceRange, programMemory },
|
||||
{ to, tag: data.tag },
|
||||
previousSketch
|
||||
)
|
||||
}
|
||||
|
||||
const min: InternalFn = (_, a: number, b: number): number => Math.min(a, b)
|
||||
|
||||
const legLen: InternalFn = (_, hypotenuse: number, leg: number): number =>
|
||||
@ -122,6 +156,7 @@ export const internalFns: { [key in InternalFnNames]: InternalFn } = {
|
||||
angledLineToX: angledLineToX.fn,
|
||||
angledLineOfYLength: angledLineOfYLength.fn,
|
||||
angledLineToY: angledLineToY.fn,
|
||||
angledLineThatIntersects,
|
||||
startSketchAt,
|
||||
closee,
|
||||
}
|
||||
|
@ -47,6 +47,7 @@ export type InternalFnNames =
|
||||
| 'angledLineToY'
|
||||
| 'startSketchAt'
|
||||
| 'closee'
|
||||
| 'angledLineThatIntersects'
|
||||
|
||||
export interface ModifyAstBase {
|
||||
node: Program
|
||||
|
@ -9360,6 +9360,11 @@ sisteransi@^1.0.4, sisteransi@^1.0.5:
|
||||
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
|
||||
integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
|
||||
|
||||
sketch-helpers@^0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/sketch-helpers/-/sketch-helpers-0.0.1.tgz#637ead1f6e39276408d2c2e2a48dfefe13dc0cb0"
|
||||
integrity sha512-ePn4nTA5sVNR6+8JalyCPQ+K7tpuYtCrccw2QGL6H2N3JRq6bO8x9RmZpyjTe/+T0uSrd2+F41d+ibsrjHHSFg==
|
||||
|
||||
slash@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
|
||||
|
Reference in New Issue
Block a user