diff --git a/src/lang/constants.ts b/src/lang/constants.ts index 64fd95449..08c9d6b2b 100644 --- a/src/lang/constants.ts +++ b/src/lang/constants.ts @@ -16,3 +16,5 @@ export const ARG_END_ABSOLUTE_Y = 'endAbsoluteY' export const ARG_INTERSECT_TAG = 'intersectTag' export const ARG_INTERIOR_ABSOLUTE = 'interiorAbsolute' export const ARG_AT = 'at' +export const ARG_LEG = 'leg' +export const ARG_HYPOTENUSE = 'hypotenuse' diff --git a/src/lang/std/sketchcombos.test.ts b/src/lang/std/sketchcombos.test.ts index 132ca93b8..b5bfd5e9e 100644 --- a/src/lang/std/sketchcombos.test.ts +++ b/src/lang/std/sketchcombos.test.ts @@ -318,8 +318,8 @@ part001 = startSketchOn(XY) |> angledLine(angle = myVar, length = segLen(seg01)) // ln-use segLen for second arg |> angledLine(angle = 45, length = segLen(seg01)) // ln-segLen again |> angledLine(angle = 54, length = segLen(seg01)) // ln-should be transformed to angledLine - |> angledLine(angle = legAngX(segLen(seg01), myVar), lengthX = min([segLen(seg01), myVar])) // ln-should use legAngX to calculate angle - |> angledLine(angle = 180 + legAngX(segLen(seg01), myVar), lengthX = min([segLen(seg01), myVar])) // ln-same as above but should have + 180 to match original quadrant + |> angledLine(angle = legAngX(hypotenuse = segLen(seg01), leg = myVar), lengthX = min([segLen(seg01), myVar])) // ln-should use legAngX to calculate angle + |> angledLine(angle = 180 + legAngX(hypotenuse = segLen(seg01), leg = myVar), lengthX = min([segLen(seg01), myVar])) // ln-same as above but should have + 180 to match original quadrant |> line(end = [ legLen(hypotenuse = segLen(seg01), leg = myVar), min([segLen(seg01), myVar]) @@ -330,8 +330,8 @@ part001 = startSketchOn(XY) ]) // ln-negative legLen yRelative |> angledLine(angle = 58, length = segLen(seg01)) // ln-angledLineOfYLength-free should become angledLine |> angledLine(angle = myAng, length = segLen(seg01)) // ln-angledLineOfYLength-angle should become angledLine - |> angledLine(angle = legAngY(segLen(seg01), myVar), lengthX = min([segLen(seg01), myVar])) // ln-angledLineOfYLength-yRelative use legAngY - |> angledLine(angle = 270 + legAngY(segLen(seg01), myVar), lengthX = min([segLen(seg01), myVar])) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp + |> angledLine(angle = legAngY(hypotenuse = segLen(seg01), leg = myVar), lengthX = min([segLen(seg01), myVar])) // ln-angledLineOfYLength-yRelative use legAngY + |> angledLine(angle = 270 + legAngY(hypotenuse = segLen(seg01), leg = myVar), lengthX = min([segLen(seg01), myVar])) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp |> xLine(length = segLen(seg01)) // ln-xLine-free should sub in segLen |> yLine(length = segLen(seg01)) // ln-yLine-free should sub in segLen |> xLine(length = segLen(seg01)) // ln-xLineTo-free should convert to xLine diff --git a/src/lang/std/sketchcombos.ts b/src/lang/std/sketchcombos.ts index 45b967437..67aa4be56 100644 --- a/src/lang/std/sketchcombos.ts +++ b/src/lang/std/sketchcombos.ts @@ -6,6 +6,8 @@ import { ARG_END, ARG_END_ABSOLUTE, ARG_END_ABSOLUTE_X, + ARG_LEG, + ARG_HYPOTENUSE, ARG_END_ABSOLUTE_Y, ARG_INTERSECT_TAG, ARG_LENGTH, @@ -473,9 +475,9 @@ const getMinAndSegAngVals = ( createArrayExpression([createSegLen(referenceSegName), varVal]), [] ) - const legAngle = createCallExpression(fnName, [ - createSegLen(referenceSegName), - varVal, + const legAngle = createCallExpressionStdLibKw(fnName, null, [ + createLabeledArg(ARG_HYPOTENUSE, createSegLen(referenceSegName)), + createLabeledArg(ARG_LEG, varVal), ]) return [minVal, legAngle] } @@ -2177,26 +2179,38 @@ export function transformAstSketchLines({ } function createSegLen(referenceSegName: string): BinaryPart { - return createCallExpression('segLen', [createLocalName(referenceSegName)]) + return createCallExpressionStdLibKw( + 'segLen', + createLocalName(referenceSegName), + [] + ) } function createSegAngle(referenceSegName: string): BinaryPart { - return createCallExpression('segAng', [createLocalName(referenceSegName)]) + return createCallExpressionStdLibKw( + 'segAng', + createLocalName(referenceSegName), + [] + ) } function createSegEnd( referenceSegName: string, isX: boolean -): Node { - return createCallExpression(isX ? 'segEndX' : 'segEndY', [ +): Node { + return createCallExpressionStdLibKw( + isX ? 'segEndX' : 'segEndY', createLocalName(referenceSegName), - ]) + [] + ) } -function createLastSeg(isX: boolean): Node { - return createCallExpression(isX ? 'lastSegX' : 'lastSegY', [ +function createLastSeg(isX: boolean): Node { + return createCallExpressionStdLibKw( + isX ? 'lastSegX' : 'lastSegY', createPipeSubstitution(), - ]) + [] + ) } export type ConstraintLevel = 'free' | 'partial' | 'full' @@ -2312,16 +2326,30 @@ export function isNotLiteralArrayOrStatic( } export function isExprBinaryPart(expr: Expr): expr is BinaryPart { - if ( - expr.type === 'Literal' || - expr.type === 'Name' || - expr.type === 'BinaryExpression' || - expr.type === 'CallExpression' || - expr.type === 'UnaryExpression' || - expr.type === 'MemberExpression' - ) - return true - return false + switch (expr.type) { + case 'Literal': + case 'Name': + case 'BinaryExpression': + case 'CallExpression': + case 'CallExpressionKw': + case 'UnaryExpression': + case 'MemberExpression': + case 'IfExpression': + return true + case 'TagDeclarator': + case 'PipeSubstitution': + case 'ArrayExpression': + case 'PipeExpression': + case 'ObjectExpression': + case 'FunctionExpression': + case 'ArrayRangeExpression': + case 'LabelledExpression': + case 'AscribedExpression': + return false + default: + const _exhaustiveCheck: never = expr + return false // unreachable + } } function getInputOfType(a: InputArgs, b: LineInputsType | 'radius'): InputArg {