comments and naming tweaks

This commit is contained in:
Kurt Hutten Irev-Dev
2024-09-10 13:15:11 +10:00
parent 0abe4c4082
commit 04e82bf728
3 changed files with 48 additions and 55 deletions

View File

@ -36,7 +36,7 @@ import {
SegmentInputs, SegmentInputs,
SimplifiedArgDetails, SimplifiedArgDetails,
RawArgs, RawArgs,
CreateStdLibSketchCallExpr, CreatedSketchExprResult,
} from 'lang/std/stdTypes' } from 'lang/std/stdTypes'
import { import {
@ -2037,9 +2037,7 @@ export function replaceSketchLine({
pathToNode: PathToNode pathToNode: PathToNode
fnName: ToolTip fnName: ToolTip
segmentInput: SegmentInputs segmentInput: SegmentInputs
replaceExistingCallback: ( replaceExistingCallback: (rawArgs: RawArgs) => CreatedSketchExprResult
rawArgs: RawArgs
) => ReturnType<CreateStdLibSketchCallExpr>
referencedSegment?: Path referencedSegment?: Path
}): }):
| { | {

View File

@ -1,4 +1,5 @@
import { import {
CreatedSketchExprResult,
CreateStdLibSketchCallExpr, CreateStdLibSketchCallExpr,
InputArg, InputArg,
InputArgs, InputArgs,
@ -17,6 +18,7 @@ import {
PathToNode, PathToNode,
ProgramMemory, ProgramMemory,
sketchGroupFromKclValue, sketchGroupFromKclValue,
Literal,
} from '../wasm' } from '../wasm'
import { import {
getNodeFromPath, getNodeFromPath,
@ -78,7 +80,7 @@ function createCallWrapper(
val: [Expr, Expr] | Expr, val: [Expr, Expr] | Expr,
tag?: Expr, tag?: Expr,
valueUsedInTransform?: number valueUsedInTransform?: number
): ReturnType<CreateStdLibSketchCallExpr> { ): CreatedSketchExprResult {
const args = const args =
tooltip === 'circle' tooltip === 'circle'
? [] ? []
@ -116,7 +118,7 @@ function createStdlibCallExpression(
val: Expr, val: Expr,
tag?: Expr, tag?: Expr,
valueUsedInTransform?: number valueUsedInTransform?: number
): ReturnType<CreateStdLibSketchCallExpr> { ): CreatedSketchExprResult {
const args = [val, createPipeSubstitution()] const args = [val, createPipeSubstitution()]
if (tag) { if (tag) {
args.push(tag) args.push(tag)
@ -141,7 +143,7 @@ function intersectCallWrapper({
intersectTag: Expr intersectTag: Expr
tag?: Expr tag?: Expr
valueUsedInTransform?: number valueUsedInTransform?: number
}): ReturnType<CreateStdLibSketchCallExpr> { }): CreatedSketchExprResult {
const firstArg: any = { const firstArg: any = {
angle: angleVal, angle: angleVal,
offset: offsetVal, offset: offsetVal,
@ -261,13 +263,11 @@ const getMinAndSegAngVals = (
return [minVal, legAngle] return [minVal, legAngle]
} }
const getSignedLeg = (arg: Expr, legLenVal: BinaryPart) => const getSignedLeg = (arg: Literal, legLenVal: BinaryPart) =>
arg.type === 'Literal' && Number(arg.value) < 0 Number(arg.value) < 0 ? createUnaryExpression(legLenVal) : legLenVal
? createUnaryExpression(legLenVal)
: legLenVal
const getLegAng = (arg: Expr, legAngleVal: BinaryPart) => { const getLegAng = (arg: Literal, legAngleVal: BinaryPart) => {
const ang = (arg.type === 'Literal' && Number(arg.value)) || 0 const ang = Number(arg.value) || 0
const normalisedAngle = ((ang % 360) + 360) % 360 // between 0 and 360 const normalisedAngle = ((ang % 360) + 360) % 360 // between 0 and 360
const truncatedTo90 = Math.floor(normalisedAngle / 90) * 90 const truncatedTo90 = Math.floor(normalisedAngle / 90) * 90
const binExp = createBinaryExpressionWithUnary([ const binExp = createBinaryExpressionWithUnary([
@ -277,18 +277,18 @@ const getLegAng = (arg: Expr, legAngleVal: BinaryPart) => {
return truncatedTo90 === 0 ? legAngleVal : binExp return truncatedTo90 === 0 ? legAngleVal : binExp
} }
const getAngleLengthSign = (arg: Expr, legAngleVal: BinaryPart) => { const getAngleLengthSign = (arg: Literal, legAngleVal: BinaryPart) => {
const ang = (arg.type === 'Literal' && Number(arg.value)) || 0 const ang = Number(arg.value) || 0
const normalisedAngle = ((ang % 180) + 180) % 180 // between 0 and 180 const normalisedAngle = ((ang % 180) + 180) % 180 // between 0 and 180
return normalisedAngle > 90 ? createUnaryExpression(legAngleVal) : legAngleVal return normalisedAngle > 90 ? createUnaryExpression(legAngleVal) : legAngleVal
} }
function getClosesAngleDirection( function getClosesAngleDirection(
arg: Expr, arg: Literal,
refAngle: number, refAngle: number,
angleVal: BinaryPart angleVal: BinaryPart
) { ) {
const currentAng = (arg.type === 'Literal' && Number(arg.value)) || 0 const currentAng = Number(arg.value) || 0
const angDiff = Math.abs(currentAng - refAngle) const angDiff = Math.abs(currentAng - refAngle)
const normalisedAngle = ((angDiff % 360) + 360) % 360 // between 0 and 180 const normalisedAngle = ((angDiff % 360) + 360) % 360 // between 0 and 180
return normalisedAngle > 90 return normalisedAngle > 90
@ -454,11 +454,8 @@ const setAngledIntersectLineForLines: CreateStdLibSketchCallExpr = ({
forceValueUsedInTransform, forceValueUsedInTransform,
rawArgs: args, rawArgs: args,
}) => { }) => {
const valueUsedInTransform = roundOff( const valueUsedInTransform = roundOff(Number(args[1].expr.value) || 0, 2)
args[1].expr.type === 'Literal' ? Number(args[1].expr.value) : 0, const angle = Number(args[0].expr.value) || 0
2
)
const angle = args[0].expr.type === 'Literal' ? Number(args[0].expr.value) : 0
const varNamMap: { [key: number]: string } = { const varNamMap: { [key: number]: string } = {
0: 'ZERO', 0: 'ZERO',
90: 'QUARTER_TURN', 90: 'QUARTER_TURN',
@ -485,10 +482,7 @@ const setAngledIntersectForAngledLines: CreateStdLibSketchCallExpr = ({
inputs, inputs,
rawArgs: args, rawArgs: args,
}) => { }) => {
const valueUsedInTransform = roundOff( const valueUsedInTransform = roundOff(Number(args[1].expr.value) || 0, 2)
args[1].expr.type === 'Literal' ? Number(args[1].expr.value) : 0,
2
)
return intersectCallWrapper({ return intersectCallWrapper({
fnName: 'angledLineThatIntersects', fnName: 'angledLineThatIntersects',
angleVal: inputs[0].expr, angleVal: inputs[0].expr,
@ -513,10 +507,7 @@ const setAngleBetweenCreateNode =
? getAngle(referencedSegment?.from, referencedSegment?.to) ? getAngle(referencedSegment?.from, referencedSegment?.to)
: 0 : 0
let valueUsedInTransform = roundOff( let valueUsedInTransform = roundOff(
normaliseAngle( normaliseAngle((Number(args[0].expr.value) || 0) - refAngle)
(args[0].expr.type === 'Literal' ? Number(args[0].expr.value) : 0) -
refAngle
)
) )
let firstHalfValue = createSegAngle(referenceSegName) as BinaryPart let firstHalfValue = createSegAngle(referenceSegName) as BinaryPart
if (Math.abs(valueUsedInTransform) > 90) { if (Math.abs(valueUsedInTransform) > 90) {
@ -824,9 +815,7 @@ const transformMap: TransformMap = {
tooltip: 'yLine', tooltip: 'yLine',
createNode: ({ inputs, tag, rawArgs: args }) => { createNode: ({ inputs, tag, rawArgs: args }) => {
const expr = inputs[1].expr const expr = inputs[1].expr
if ( if (Number(args[0].expr.value) >= 0)
!(args[0].expr.type === 'Literal' && Number(args[0].expr.value) < 0)
)
return createCallWrapper('yLine', expr, tag) return createCallWrapper('yLine', expr, tag)
if (isExprBinaryPart(expr)) if (isExprBinaryPart(expr))
return createCallWrapper('yLine', createUnaryExpression(expr), tag) return createCallWrapper('yLine', createUnaryExpression(expr), tag)
@ -838,9 +827,7 @@ const transformMap: TransformMap = {
tooltip: 'xLine', tooltip: 'xLine',
createNode: ({ inputs, tag, rawArgs: args }) => { createNode: ({ inputs, tag, rawArgs: args }) => {
const expr = inputs[1].expr const expr = inputs[1].expr
if ( if (Number(args[0].expr.value) >= 0)
!(args[0].expr.type === 'Literal' && Number(args[0].expr.value) < 0)
)
return createCallWrapper('xLine', expr, tag) return createCallWrapper('xLine', expr, tag)
if (isExprBinaryPart(expr)) if (isExprBinaryPart(expr))
return createCallWrapper('xLine', createUnaryExpression(expr), tag) return createCallWrapper('xLine', createUnaryExpression(expr), tag)
@ -895,9 +882,7 @@ const transformMap: TransformMap = {
tooltip: 'xLine', tooltip: 'xLine',
createNode: ({ inputs, tag, rawArgs: args }) => { createNode: ({ inputs, tag, rawArgs: args }) => {
const expr = inputs[1].expr const expr = inputs[1].expr
if ( if (Number(args[0].expr.value) >= 0)
!(args[0].expr.type === 'Literal' && Number(args[0].expr.value) < 0)
)
return createCallWrapper('xLine', expr, tag) return createCallWrapper('xLine', expr, tag)
if (isExprBinaryPart(expr)) if (isExprBinaryPart(expr))
return createCallWrapper('xLine', createUnaryExpression(expr), tag) return createCallWrapper('xLine', createUnaryExpression(expr), tag)
@ -949,9 +934,7 @@ const transformMap: TransformMap = {
tooltip: 'yLine', tooltip: 'yLine',
createNode: ({ inputs, tag, rawArgs: args }) => { createNode: ({ inputs, tag, rawArgs: args }) => {
const expr = inputs[1].expr const expr = inputs[1].expr
if ( if (Number(args[0].expr.value) >= 0)
!(args[0].expr.type === 'Literal' && Number(args[0].expr.value) < 0)
)
return createCallWrapper('yLine', expr, tag) return createCallWrapper('yLine', expr, tag)
if (isExprBinaryPart(expr)) if (isExprBinaryPart(expr))
return createCallWrapper('yLine', createUnaryExpression(expr), tag) return createCallWrapper('yLine', createUnaryExpression(expr), tag)
@ -1806,8 +1789,8 @@ function createLastSeg(isX: boolean): CallExpression {
]) ])
} }
function getArgLiteralVal(arg: Expr): number { function getArgLiteralVal(arg: Literal): number {
return arg?.type === 'Literal' ? Number(arg.value) : 0 return Number(arg.value) || 0
} }
export type ConstraintLevel = 'free' | 'partial' | 'full' export type ConstraintLevel = 'free' | 'partial' | 'full'

View File

@ -63,9 +63,7 @@ export type SegmentInputs = StraightSegmentInput | ArcSegmentInput
*/ */
interface addCall extends ModifyAstBase { interface addCall extends ModifyAstBase {
segmentInput: SegmentInputs segmentInput: SegmentInputs
replaceExistingCallback?: ( replaceExistingCallback?: (rawArgs: RawArgs) => CreatedSketchExprResult
rawArgs: RawArgs
) => ReturnType<CreateStdLibSketchCallExpr>
referencedSegment?: Path referencedSegment?: Path
spliceBetween?: boolean spliceBetween?: boolean
} }
@ -170,18 +168,32 @@ export type SimplifiedArgDetails =
index: 0 | 1 index: 0 | 1
} }
export type CreateStdLibSketchCallExpr = (args: { /**
inputs: InputArgs * Represents the result of creating a sketch expression (line, tangentialArcTo, angledLine, circle, etc.).
referenceSegName: string *
tag?: Expr * @property {Expr} callExp - This is the main result; recasting the expression should give the user the new function call.
forceValueUsedInTransform?: Expr * @property {number} [valueUsedInTransform] - Aside from `callExp`, we also return the number used in the transform, which is useful for constraints.
rawArgs: InputArgs * For example, when adding a "horizontal distance" constraint, we don't want the segments to move, just constrain them in place.
referencedSegment?: Path * So the second segment will probably be something like `lineTo([segEndX($firstSegTag) + someLiteral, 123], %)` where `someLiteral` is
}) => { * the value of the current horizontal distance, that we calculate to constrain the second segment without it moving.
* We can run the ast-mod to get this constraint `valueUsedInTransform` without applying the mod so that we can surface this to the user in a modal.
* We show them the modal where they can specify the distance they want to constrain to.
* We pre-fill this with the current value `valueUsedInTransform`, which they can accept or change, and we'll use that to apply the final ast-mod.
*/
export interface CreatedSketchExprResult {
callExp: Expr callExp: Expr
valueUsedInTransform?: number valueUsedInTransform?: number
} }
export type CreateStdLibSketchCallExpr = (args: {
inputs: InputArgs
rawArgs: RawArgs
referenceSegName: string
tag?: Expr
forceValueUsedInTransform?: Expr
referencedSegment?: Path
}) => CreatedSketchExprResult
export type TransformInfo = { export type TransformInfo = {
tooltip: ToolTip tooltip: ToolTip
createNode: CreateStdLibSketchCallExpr createNode: CreateStdLibSketchCallExpr