clean up create call back double function stuff

This commit is contained in:
Kurt Hutten Irev-Dev
2024-09-10 01:08:57 +10:00
parent 99ffc82ffa
commit 25080e9895
12 changed files with 700 additions and 775 deletions

View File

@ -10,10 +10,10 @@ import {
transformSecondarySketchLinesTagFirst, transformSecondarySketchLinesTagFirst,
getTransformInfos, getTransformInfos,
PathToNodeMap, PathToNodeMap,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { kclManager } from 'lib/singletons' import { kclManager } from 'lib/singletons'
import { err } from 'lib/trap' import { err } from 'lib/trap'
import { TransformInfo } from 'lang/std/stdTypes'
export function equalAngleInfo({ export function equalAngleInfo({
selectionRanges, selectionRanges,

View File

@ -10,8 +10,8 @@ import {
transformSecondarySketchLinesTagFirst, transformSecondarySketchLinesTagFirst,
getTransformInfos, getTransformInfos,
PathToNodeMap, PathToNodeMap,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { TransformInfo } from 'lang/std/stdTypes'
import { kclManager } from 'lib/singletons' import { kclManager } from 'lib/singletons'
import { err } from 'lib/trap' import { err } from 'lib/trap'

View File

@ -9,8 +9,8 @@ import {
PathToNodeMap, PathToNodeMap,
getTransformInfos, getTransformInfos,
transformAstSketchLines, transformAstSketchLines,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { TransformInfo } from 'lang/std/stdTypes'
import { kclManager } from 'lib/singletons' import { kclManager } from 'lib/singletons'
import { err } from 'lib/trap' import { err } from 'lib/trap'

View File

@ -11,8 +11,8 @@ import {
transformSecondarySketchLinesTagFirst, transformSecondarySketchLinesTagFirst,
getTransformInfos, getTransformInfos,
PathToNodeMap, PathToNodeMap,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { TransformInfo } from 'lang/std/stdTypes'
import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal' import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal'
import { createVariableDeclaration } from '../../lang/modifyAst' import { createVariableDeclaration } from '../../lang/modifyAst'
import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { removeDoubleNegatives } from '../AvailableVarsHelpers'

View File

@ -9,8 +9,8 @@ import {
PathToNodeMap, PathToNodeMap,
getRemoveConstraintsTransforms, getRemoveConstraintsTransforms,
transformAstSketchLines, transformAstSketchLines,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { TransformInfo } from 'lang/std/stdTypes'
import { kclManager } from 'lib/singletons' import { kclManager } from 'lib/singletons'
import { err } from 'lib/trap' import { err } from 'lib/trap'

View File

@ -9,8 +9,8 @@ import {
getTransformInfos, getTransformInfos,
transformAstSketchLines, transformAstSketchLines,
PathToNodeMap, PathToNodeMap,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { TransformInfo } from 'lang/std/stdTypes'
import { import {
SetAngleLengthModal, SetAngleLengthModal,
createSetAngleLengthModal, createSetAngleLengthModal,

View File

@ -10,8 +10,8 @@ import {
transformSecondarySketchLinesTagFirst, transformSecondarySketchLinesTagFirst,
getTransformInfos, getTransformInfos,
PathToNodeMap, PathToNodeMap,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { TransformInfo } from 'lang/std/stdTypes'
import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal' import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal'
import { createVariableDeclaration } from '../../lang/modifyAst' import { createVariableDeclaration } from '../../lang/modifyAst'
import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { removeDoubleNegatives } from '../AvailableVarsHelpers'

View File

@ -9,8 +9,8 @@ import {
transformSecondarySketchLinesTagFirst, transformSecondarySketchLinesTagFirst,
getTransformInfos, getTransformInfos,
PathToNodeMap, PathToNodeMap,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { TransformInfo } from 'lang/std/stdTypes'
import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal' import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal'
import { createLiteral, createVariableDeclaration } from '../../lang/modifyAst' import { createLiteral, createVariableDeclaration } from '../../lang/modifyAst'
import { removeDoubleNegatives } from '../AvailableVarsHelpers' import { removeDoubleNegatives } from '../AvailableVarsHelpers'

View File

@ -9,8 +9,8 @@ import {
PathToNodeMap, PathToNodeMap,
getTransformInfos, getTransformInfos,
transformAstSketchLines, transformAstSketchLines,
TransformInfo,
} from '../../lang/std/sketchcombos' } from '../../lang/std/sketchcombos'
import { TransformInfo } from 'lang/std/stdTypes'
import { import {
SetAngleLengthModal, SetAngleLengthModal,
createSetAngleLengthModal, createSetAngleLengthModal,

View File

@ -28,7 +28,6 @@ import { createPipeExpression, splitPathAtPipeExpression } from '../modifyAst'
import { import {
SketchLineHelper, SketchLineHelper,
TransformCallback,
ConstrainInfo, ConstrainInfo,
ArrayItemInput, ArrayItemInput,
ObjectPropertyInput, ObjectPropertyInput,
@ -36,6 +35,8 @@ import {
AddTagInfo, AddTagInfo,
SegmentInputs, SegmentInputs,
SimplifiedArgDetails, SimplifiedArgDetails,
RawArgs,
CreateStdLibSketchCallExpr,
} from 'lang/std/stdTypes' } from 'lang/std/stdTypes'
import { import {
@ -321,8 +322,7 @@ export const lineTo: SketchLineHelper = {
]) ])
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
if (replaceExisting && createCallback) { if (replaceExisting && createCallback) {
const { callExp, valueUsedInTransform } = createCallback( const { callExp, valueUsedInTransform } = createCallback([
[
{ {
type: 'arrayItem', type: 'arrayItem',
index: 0, index: 0,
@ -335,9 +335,7 @@ export const lineTo: SketchLineHelper = {
argType: 'yAbsolute', argType: 'yAbsolute',
expr: createLiteral(roundOff(to[1], 2)), expr: createLiteral(roundOff(to[1], 2)),
}, },
], ])
referencedSegment
)
pipe.body[callIndex] = callExp pipe.body[callIndex] = callExp
return { return {
modifiedAst: _node, modifiedAst: _node,
@ -441,8 +439,7 @@ export const line: SketchLineHelper = {
if (replaceExisting && createCallback && pipe.type !== 'CallExpression') { if (replaceExisting && createCallback && pipe.type !== 'CallExpression') {
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
const { callExp, valueUsedInTransform } = createCallback( const { callExp, valueUsedInTransform } = createCallback([
[
{ {
type: 'arrayItem', type: 'arrayItem',
index: 0, index: 0,
@ -455,9 +452,7 @@ export const line: SketchLineHelper = {
argType: 'yRelative', argType: 'yRelative',
expr: createLiteral(roundOff(to[1] - from[1], 2)), expr: createLiteral(roundOff(to[1] - from[1], 2)),
}, },
], ])
referencedSegment
)
pipe.body[callIndex] = callExp pipe.body[callIndex] = callExp
return { return {
modifiedAst: _node, modifiedAst: _node,
@ -842,8 +837,7 @@ export const tangentialArcTo: SketchLineHelper = {
if (replaceExisting && createCallback && pipe.type !== 'CallExpression') { if (replaceExisting && createCallback && pipe.type !== 'CallExpression') {
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
const { callExp, valueUsedInTransform } = createCallback( const { callExp, valueUsedInTransform } = createCallback([
[
{ {
type: 'arrayItem', type: 'arrayItem',
index: 0, index: 0,
@ -856,9 +850,7 @@ export const tangentialArcTo: SketchLineHelper = {
argType: 'yAbsolute', argType: 'yAbsolute',
expr: toY, expr: toY,
}, },
], ])
referencedSegment
)
pipe.body[callIndex] = callExp pipe.body[callIndex] = callExp
return { return {
modifiedAst: _node, modifiedAst: _node,
@ -1154,8 +1146,7 @@ export const angledLine: SketchLineHelper = {
if (replaceExisting && createCallback) { if (replaceExisting && createCallback) {
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
const { callExp, valueUsedInTransform } = createCallback( const { callExp, valueUsedInTransform } = createCallback([
[
{ {
type: 'arrayOrObjItem', type: 'arrayOrObjItem',
index: 0, index: 0,
@ -1170,9 +1161,7 @@ export const angledLine: SketchLineHelper = {
argType: 'length', argType: 'length',
expr: newLengthVal, expr: newLengthVal,
}, },
], ])
referencedSegment
)
pipe.body[callIndex] = callExp pipe.body[callIndex] = callExp
return { return {
modifiedAst: _node, modifiedAst: _node,
@ -1471,8 +1460,7 @@ export const angledLineToX: SketchLineHelper = {
const angle = createLiteral(roundOff(getAngle(from, to), 0)) const angle = createLiteral(roundOff(getAngle(from, to), 0))
const xArg = createLiteral(roundOff(to[0], 2)) const xArg = createLiteral(roundOff(to[0], 2))
if (replaceExisting && createCallback) { if (replaceExisting && createCallback) {
const { callExp, valueUsedInTransform } = createCallback( const { callExp, valueUsedInTransform } = createCallback([
[
{ {
type: 'arrayOrObjItem', type: 'arrayOrObjItem',
index: 0, index: 0,
@ -1487,9 +1475,7 @@ export const angledLineToX: SketchLineHelper = {
argType: 'xAbsolute', argType: 'xAbsolute',
expr: xArg, expr: xArg,
}, },
], ])
referencedSegment
)
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
pipe.body[callIndex] = callExp pipe.body[callIndex] = callExp
return { return {
@ -1575,8 +1561,7 @@ export const angledLineToY: SketchLineHelper = {
const yArg = createLiteral(roundOff(to[1], 2)) const yArg = createLiteral(roundOff(to[1], 2))
if (replaceExisting && createCallback) { if (replaceExisting && createCallback) {
const { callExp, valueUsedInTransform } = createCallback( const { callExp, valueUsedInTransform } = createCallback([
[
{ {
type: 'arrayOrObjItem', type: 'arrayOrObjItem',
index: 0, index: 0,
@ -1591,9 +1576,7 @@ export const angledLineToY: SketchLineHelper = {
argType: 'yAbsolute', argType: 'yAbsolute',
expr: yArg, expr: yArg,
}, },
], ])
referencedSegment
)
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
pipe.body[callIndex] = callExp pipe.body[callIndex] = callExp
return { return {
@ -2121,7 +2104,7 @@ export function replaceSketchLine({
pathToNode: PathToNode pathToNode: PathToNode
fnName: ToolTip fnName: ToolTip
segmentInput: SegmentInputs segmentInput: SegmentInputs
createCallback: TransformCallback createCallback: (rawArgs: RawArgs) => ReturnType<CreateStdLibSketchCallExpr>
referencedSegment?: Path referencedSegment?: Path
}): }):
| { | {
@ -2151,13 +2134,16 @@ export function replaceSketchLine({
return { modifiedAst, valueUsedInTransform, pathToNode } return { modifiedAst, valueUsedInTransform, pathToNode }
} }
export function addTagForSketchOnFace(a: AddTagInfo, expressionName: string) { export function addTagForSketchOnFace(
tagInfo: AddTagInfo,
expressionName: string
) {
if (expressionName === 'close') { if (expressionName === 'close') {
return addTag(1)(a) return addTag(1)(tagInfo)
} }
if (expressionName in sketchLineHelperMap) { if (expressionName in sketchLineHelperMap) {
const { addTag } = sketchLineHelperMap[expressionName] const { addTag } = sketchLineHelperMap[expressionName]
return addTag(a) return addTag(tagInfo)
} }
return new Error(`"${expressionName}" is not a sketch line helper`) return new Error(`"${expressionName}" is not a sketch line helper`)
} }

View File

@ -1,8 +1,9 @@
import { import {
CreateStdLibSketchCallExpr,
InputArg, InputArg,
InputArgs, InputArgs,
SimplifiedArgDetails, SimplifiedArgDetails,
TransformCallback, TransformInfo,
} from './stdTypes' } from './stdTypes'
import { ToolTip, toolTips } from 'lang/langHelpers' import { ToolTip, toolTips } from 'lang/langHelpers'
import { Selections, Selection } from 'lib/selections' import { Selections, Selection } from 'lib/selections'
@ -77,7 +78,7 @@ function createCallWrapper(
val: [Expr, Expr] | Expr, val: [Expr, Expr] | Expr,
tag?: Expr, tag?: Expr,
valueUsedInTransform?: number valueUsedInTransform?: number
): ReturnType<TransformCallback> { ): ReturnType<CreateStdLibSketchCallExpr> {
const args = const args =
tooltip === 'circle' tooltip === 'circle'
? [] ? []
@ -115,7 +116,7 @@ function createStdlibCallExpression(
val: Expr, val: Expr,
tag?: Expr, tag?: Expr,
valueUsedInTransform?: number valueUsedInTransform?: number
): ReturnType<TransformCallback> { ): ReturnType<CreateStdLibSketchCallExpr> {
const args = [val, createPipeSubstitution()] const args = [val, createPipeSubstitution()]
if (tag) { if (tag) {
args.push(tag) args.push(tag)
@ -140,7 +141,7 @@ function intersectCallWrapper({
intersectTag: Expr intersectTag: Expr
tag?: Expr tag?: Expr
valueUsedInTransform?: number valueUsedInTransform?: number
}): ReturnType<TransformCallback> { }): ReturnType<CreateStdLibSketchCallExpr> {
const firstArg: any = { const firstArg: any = {
angle: angleVal, angle: angleVal,
offset: offsetVal, offset: offsetVal,
@ -159,16 +160,6 @@ function intersectCallWrapper({
} }
} }
export type TransformInfo = {
tooltip: ToolTip
createNode: (a: {
inputs: InputArgs
referenceSegName: string
tag?: Expr
forceValueUsedInTransform?: Expr
}) => TransformCallback
}
type TransformMap = { type TransformMap = {
[key in ToolTip]?: { [key in ToolTip]?: {
[key in LineInputsType | 'free']?: { [key in LineInputsType | 'free']?: {
@ -178,12 +169,8 @@ type TransformMap = {
} }
const xyLineSetLength = const xyLineSetLength =
( (xOrY: 'xLine' | 'yLine', referenceSeg = false): CreateStdLibSketchCallExpr =>
xOrY: 'xLine' | 'yLine', ({ referenceSegName, tag, forceValueUsedInTransform, rawArgs: args }) => {
referenceSeg = false
): TransformInfo['createNode'] =>
({ referenceSegName, tag, forceValueUsedInTransform }) =>
(args) => {
const segRef = createSegLen(referenceSegName) const segRef = createSegLen(referenceSegName)
const lineVal = forceValueUsedInTransform const lineVal = forceValueUsedInTransform
? forceValueUsedInTransform ? forceValueUsedInTransform
@ -198,9 +185,15 @@ const basicAngledLineCreateNode =
referenceSeg: 'ang' | 'len' | 'none' = 'none', referenceSeg: 'ang' | 'len' | 'none' = 'none',
valToForce: 'ang' | 'len' | 'none' = 'none', valToForce: 'ang' | 'len' | 'none' = 'none',
varValToUse: 'ang' | 'len' | 'none' = 'none' varValToUse: 'ang' | 'len' | 'none' = 'none'
): TransformInfo['createNode'] => ): CreateStdLibSketchCallExpr =>
({ referenceSegName, tag, forceValueUsedInTransform, inputs }) => ({
(args, path) => { referenceSegName,
tag,
forceValueUsedInTransform,
inputs,
rawArgs: args,
referencedSegment: path,
}) => {
const refAng = path ? getAngle(path?.from, path?.to) : 0 const refAng = path ? getAngle(path?.from, path?.to) : 0
const nonForcedAng = const nonForcedAng =
varValToUse === 'ang' varValToUse === 'ang'
@ -230,9 +223,11 @@ const basicAngledLineCreateNode =
getArgLiteralVal(valToForce === 'ang' ? args[0].expr : args[1].expr) getArgLiteralVal(valToForce === 'ang' ? args[0].expr : args[1].expr)
) )
} }
const angledLineAngleCreateNode: TransformInfo['createNode'] = const angledLineAngleCreateNode: CreateStdLibSketchCallExpr = ({
({ referenceSegName, inputs, tag }) => referenceSegName,
() => inputs,
tag,
}) =>
createCallWrapper( createCallWrapper(
'angledLine', 'angledLine',
[inputs[0].expr, createSegLen(referenceSegName)], [inputs[0].expr, createSegLen(referenceSegName)],
@ -302,12 +297,14 @@ function getClosesAngleDirection(
} }
const setHorzVertDistanceCreateNode = const setHorzVertDistanceCreateNode =
( (xOrY: 'x' | 'y', index = xOrY === 'x' ? 0 : 1): CreateStdLibSketchCallExpr =>
xOrY: 'x' | 'y', ({
index = xOrY === 'x' ? 0 : 1 referenceSegName,
): TransformInfo['createNode'] => tag,
({ referenceSegName, tag, forceValueUsedInTransform }) => { forceValueUsedInTransform,
return (args, referencedSegment) => { rawArgs: args,
referencedSegment,
}) => {
const valueUsedInTransform = roundOff( const valueUsedInTransform = roundOff(
getArgLiteralVal(args?.[index].expr) - getArgLiteralVal(args?.[index].expr) -
(referencedSegment?.to?.[index] || 0), (referencedSegment?.to?.[index] || 0),
@ -328,17 +325,18 @@ const setHorzVertDistanceCreateNode =
valueUsedInTransform valueUsedInTransform
) )
} }
}
const setHorzVertDistanceForAngleLineCreateNode = const setHorzVertDistanceForAngleLineCreateNode =
( (xOrY: 'x' | 'y', index = xOrY === 'x' ? 0 : 1): CreateStdLibSketchCallExpr =>
xOrY: 'x' | 'y', ({
index = xOrY === 'x' ? 0 : 1 referenceSegName,
): TransformInfo['createNode'] => tag,
({ referenceSegName, tag, forceValueUsedInTransform, inputs }) => { forceValueUsedInTransform,
return (args, referencedSegment) => { inputs,
rawArgs: args,
referencedSegment,
}) => {
const valueUsedInTransform = roundOff( const valueUsedInTransform = roundOff(
getArgLiteralVal(args?.[1].expr) - getArgLiteralVal(args?.[1].expr) - (referencedSegment?.to?.[index] || 0),
(referencedSegment?.to?.[index] || 0),
2 2
) )
const binExp = createBinaryExpressionWithUnary([ const binExp = createBinaryExpressionWithUnary([
@ -353,16 +351,14 @@ const setHorzVertDistanceForAngleLineCreateNode =
valueUsedInTransform valueUsedInTransform
) )
} }
}
const setAbsDistanceCreateNode = const setAbsDistanceCreateNode =
( (
xOrY: 'x' | 'y', xOrY: 'x' | 'y',
isXOrYLine = false, isXOrYLine = false,
index = xOrY === 'x' ? 0 : 1 index = xOrY === 'x' ? 0 : 1
): TransformInfo['createNode'] => ): CreateStdLibSketchCallExpr =>
({ tag, forceValueUsedInTransform }) => ({ tag, forceValueUsedInTransform, rawArgs: args }) => {
(args) => {
const valueUsedInTransform = roundOff( const valueUsedInTransform = roundOff(
getArgLiteralVal(args?.[index].expr), getArgLiteralVal(args?.[index].expr),
2 2
@ -386,9 +382,8 @@ const setAbsDistanceCreateNode =
) )
} }
const setAbsDistanceForAngleLineCreateNode = const setAbsDistanceForAngleLineCreateNode =
(xOrY: 'x' | 'y'): TransformInfo['createNode'] => (xOrY: 'x' | 'y'): CreateStdLibSketchCallExpr =>
({ tag, forceValueUsedInTransform, inputs }) => { ({ tag, forceValueUsedInTransform, inputs, rawArgs: args }) => {
return (args) => {
const valueUsedInTransform = roundOff(getArgLiteralVal(args?.[1].expr), 2) const valueUsedInTransform = roundOff(getArgLiteralVal(args?.[1].expr), 2)
const val = const val =
(forceValueUsedInTransform as BinaryPart) || (forceValueUsedInTransform as BinaryPart) ||
@ -400,12 +395,16 @@ const setAbsDistanceForAngleLineCreateNode =
valueUsedInTransform valueUsedInTransform
) )
} }
}
const setHorVertDistanceForXYLines = const setHorVertDistanceForXYLines =
(xOrY: 'x' | 'y'): TransformInfo['createNode'] => (xOrY: 'x' | 'y'): CreateStdLibSketchCallExpr =>
({ referenceSegName, tag, forceValueUsedInTransform }) => { ({
return (args, referencedSegment) => { referenceSegName,
tag,
forceValueUsedInTransform,
rawArgs: args,
referencedSegment,
}) => {
const index = xOrY === 'x' ? 0 : 1 const index = xOrY === 'x' ? 0 : 1
const valueUsedInTransform = roundOff( const valueUsedInTransform = roundOff(
getArgLiteralVal(args?.[index].expr) - getArgLiteralVal(args?.[index].expr) -
@ -424,11 +423,10 @@ const setHorVertDistanceForXYLines =
valueUsedInTransform valueUsedInTransform
) )
} }
}
const setHorzVertDistanceConstraintLineCreateNode = const setHorzVertDistanceConstraintLineCreateNode =
(isX: boolean): TransformInfo['createNode'] => (isX: boolean): CreateStdLibSketchCallExpr =>
({ referenceSegName, tag, inputs }) => { ({ referenceSegName, tag, inputs, rawArgs: args, referencedSegment }) => {
let varVal = isX ? inputs[1].expr : inputs[0].expr let varVal = isX ? inputs[1].expr : inputs[0].expr
varVal = isExprBinaryPart(varVal) ? varVal : createLiteral(0) varVal = isExprBinaryPart(varVal) ? varVal : createLiteral(0)
const varValBinExp = createBinaryExpressionWithUnary([ const varValBinExp = createBinaryExpressionWithUnary([
@ -436,14 +434,11 @@ const setHorzVertDistanceConstraintLineCreateNode =
varVal, varVal,
]) ])
return (args, referencedSegment) => {
const makeBinExp = (index: 0 | 1) => { const makeBinExp = (index: 0 | 1) => {
const arg = getArgLiteralVal(args?.[index].expr) const arg = getArgLiteralVal(args?.[index].expr)
return createBinaryExpressionWithUnary([ return createBinaryExpressionWithUnary([
createSegEnd(referenceSegName, isX), createSegEnd(referenceSegName, isX),
createLiteral( createLiteral(roundOff(arg - (referencedSegment?.to?.[index] || 0), 2)),
roundOff(arg - (referencedSegment?.to?.[index] || 0), 2)
),
]) ])
} }
return createCallWrapper( return createCallWrapper(
@ -452,17 +447,18 @@ const setHorzVertDistanceConstraintLineCreateNode =
tag tag
) )
} }
}
const setAngledIntersectLineForLines: TransformInfo['createNode'] = const setAngledIntersectLineForLines: CreateStdLibSketchCallExpr = ({
({ referenceSegName, tag, forceValueUsedInTransform }) => referenceSegName,
(args) => { tag,
forceValueUsedInTransform,
rawArgs: args,
}) => {
const valueUsedInTransform = roundOff( const valueUsedInTransform = roundOff(
args[1].expr.type === 'Literal' ? Number(args[1].expr.value) : 0, args[1].expr.type === 'Literal' ? Number(args[1].expr.value) : 0,
2 2
) )
const angle = const angle = args[0].expr.type === 'Literal' ? Number(args[0].expr.value) : 0
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',
@ -475,17 +471,20 @@ const setAngledIntersectLineForLines: TransformInfo['createNode'] =
return intersectCallWrapper({ return intersectCallWrapper({
fnName: 'angledLineThatIntersects', fnName: 'angledLineThatIntersects',
angleVal, angleVal,
offsetVal: offsetVal: forceValueUsedInTransform || createLiteral(valueUsedInTransform),
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
intersectTag: createIdentifier(referenceSegName), intersectTag: createIdentifier(referenceSegName),
tag, tag,
valueUsedInTransform, valueUsedInTransform,
}) })
} }
const setAngledIntersectForAngledLines: TransformInfo['createNode'] = const setAngledIntersectForAngledLines: CreateStdLibSketchCallExpr = ({
({ referenceSegName, tag, forceValueUsedInTransform, inputs }) => referenceSegName,
(args) => { tag,
forceValueUsedInTransform,
inputs,
rawArgs: args,
}) => {
const valueUsedInTransform = roundOff( const valueUsedInTransform = roundOff(
args[1].expr.type === 'Literal' ? Number(args[1].expr.value) : 0, args[1].expr.type === 'Literal' ? Number(args[1].expr.value) : 0,
2 2
@ -493,18 +492,23 @@ const setAngledIntersectForAngledLines: TransformInfo['createNode'] =
return intersectCallWrapper({ return intersectCallWrapper({
fnName: 'angledLineThatIntersects', fnName: 'angledLineThatIntersects',
angleVal: inputs[0].expr, angleVal: inputs[0].expr,
offsetVal: offsetVal: forceValueUsedInTransform || createLiteral(valueUsedInTransform),
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
intersectTag: createIdentifier(referenceSegName), intersectTag: createIdentifier(referenceSegName),
tag, tag,
valueUsedInTransform, valueUsedInTransform,
}) })
} }
const setAngleBetweenCreateNode = const setAngleBetweenCreateNode =
(tranformToType: 'none' | 'xAbs' | 'yAbs'): TransformInfo['createNode'] => (tranformToType: 'none' | 'xAbs' | 'yAbs'): CreateStdLibSketchCallExpr =>
({ referenceSegName, tag, forceValueUsedInTransform, inputs }) => { ({
return (args, referencedSegment) => { referenceSegName,
tag,
forceValueUsedInTransform,
inputs,
rawArgs: args,
referencedSegment,
}) => {
const refAngle = referencedSegment const refAngle = referencedSegment
? getAngle(referencedSegment?.from, referencedSegment?.to) ? getAngle(referencedSegment?.from, referencedSegment?.to)
: 0 : 0
@ -543,20 +547,18 @@ const setAngleBetweenCreateNode =
valueUsedInTransform valueUsedInTransform
) )
} }
}
const transformMap: TransformMap = { const transformMap: TransformMap = {
line: { line: {
xRelative: { xRelative: {
equalLength: { equalLength: {
tooltip: 'line', tooltip: 'line',
createNode: ({ referenceSegName, inputs, tag }) => { createNode: ({ referenceSegName, inputs, tag, rawArgs: args }) => {
const [minVal, legLenVal] = getMinAndSegLenVals( const [minVal, legLenVal] = getMinAndSegLenVals(
referenceSegName, referenceSegName,
inputs[0].expr inputs[0].expr
) )
return (args) => return createCallWrapper(
createCallWrapper(
'line', 'line',
[minVal, getSignedLeg(args[1].expr, legLenVal)], [minVal, getSignedLeg(args[1].expr, legLenVal)],
tag tag
@ -565,9 +567,7 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLine', tooltip: 'xLine',
createNode: createNode: ({ inputs, tag }) =>
({ inputs, tag }) =>
() =>
createCallWrapper('xLine', inputs[0].expr, tag), createCallWrapper('xLine', inputs[0].expr, tag),
}, },
setVertDistance: { setVertDistance: {
@ -578,13 +578,12 @@ const transformMap: TransformMap = {
yRelative: { yRelative: {
equalLength: { equalLength: {
tooltip: 'line', tooltip: 'line',
createNode: ({ referenceSegName, inputs, tag }) => { createNode: ({ referenceSegName, inputs, tag, rawArgs: args }) => {
const [minVal, legLenVal] = getMinAndSegLenVals( const [minVal, legLenVal] = getMinAndSegLenVals(
referenceSegName, referenceSegName,
inputs[1].expr inputs[1].expr
) )
return (args) => return createCallWrapper(
createCallWrapper(
'line', 'line',
[getSignedLeg(args[0].expr, legLenVal), minVal], [getSignedLeg(args[0].expr, legLenVal), minVal],
tag tag
@ -593,9 +592,7 @@ const transformMap: TransformMap = {
}, },
vertical: { vertical: {
tooltip: 'yLine', tooltip: 'yLine',
createNode: createNode: ({ inputs, tag }) =>
({ inputs, tag }) =>
() =>
createCallWrapper('yLine', inputs[1].expr, tag), createCallWrapper('yLine', inputs[1].expr, tag),
}, },
setHorzDistance: { setHorzDistance: {
@ -610,16 +607,12 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLine', tooltip: 'xLine',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper('xLine', args[0].expr, tag), createCallWrapper('xLine', args[0].expr, tag),
}, },
vertical: { vertical: {
tooltip: 'yLine', tooltip: 'yLine',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper( createCallWrapper(
'yLine', 'yLine',
getInputOfType(args, 'yRelative').expr, getInputOfType(args, 'yRelative').expr,
@ -672,16 +665,12 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLineTo', tooltip: 'xLineTo',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper('xLineTo', args[0].expr, tag), createCallWrapper('xLineTo', args[0].expr, tag),
}, },
vertical: { vertical: {
tooltip: 'yLineTo', tooltip: 'yLineTo',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper( createCallWrapper(
'yLineTo', 'yLineTo',
getInputOfType(args, 'yAbsolute').expr, getInputOfType(args, 'yAbsolute').expr,
@ -692,9 +681,7 @@ const transformMap: TransformMap = {
xAbsolute: { xAbsolute: {
equalLength: { equalLength: {
tooltip: 'angledLineToX', tooltip: 'angledLineToX',
createNode: createNode: ({ referenceSegName, inputs, tag, rawArgs: args }) => {
({ referenceSegName, inputs, tag }) =>
(args) => {
const angleToMatchLengthXCall = createCallExpression( const angleToMatchLengthXCall = createCallExpression(
'angleToMatchLengthX', 'angleToMatchLengthX',
[ [
@ -715,9 +702,7 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLineTo', tooltip: 'xLineTo',
createNode: createNode: ({ inputs, tag }) =>
({ inputs, tag }) =>
() =>
createCallWrapper('xLineTo', inputs[0].expr, tag), createCallWrapper('xLineTo', inputs[0].expr, tag),
}, },
setAngleBetween: { setAngleBetween: {
@ -728,9 +713,7 @@ const transformMap: TransformMap = {
yAbsolute: { yAbsolute: {
equalLength: { equalLength: {
tooltip: 'angledLineToY', tooltip: 'angledLineToY',
createNode: createNode: ({ referenceSegName, inputs, tag, rawArgs: args }) => {
({ referenceSegName, inputs, tag }) =>
(args) => {
const angleToMatchLengthYCall = createCallExpression( const angleToMatchLengthYCall = createCallExpression(
'angleToMatchLengthY', 'angleToMatchLengthY',
[ [
@ -751,16 +734,17 @@ const transformMap: TransformMap = {
}, },
vertical: { vertical: {
tooltip: 'yLineTo', tooltip: 'yLineTo',
createNode: createNode: ({ inputs, tag }) =>
({ inputs, tag }) =>
() =>
createCallWrapper('yLineTo', inputs[1].expr, tag), createCallWrapper('yLineTo', inputs[1].expr, tag),
}, },
setAngle: { setAngle: {
tooltip: 'angledLineToY', tooltip: 'angledLineToY',
createNode: createNode: ({
({ inputs, tag, forceValueUsedInTransform }) => inputs,
(args) => { tag,
forceValueUsedInTransform,
rawArgs: args,
}) => {
return createCallWrapper( return createCallWrapper(
'angledLineToY', 'angledLineToY',
[forceValueUsedInTransform || args[0].expr, inputs[1].expr], [forceValueUsedInTransform || args[0].expr, inputs[1].expr],
@ -779,9 +763,7 @@ const transformMap: TransformMap = {
angle: { angle: {
equalLength: { equalLength: {
tooltip: 'angledLine', tooltip: 'angledLine',
createNode: createNode: ({ referenceSegName, inputs, tag }) =>
({ referenceSegName, inputs, tag }) =>
() =>
createCallWrapper( createCallWrapper(
'angledLine', 'angledLine',
[inputs[0].expr, createSegLen(referenceSegName)], [inputs[0].expr, createSegLen(referenceSegName)],
@ -824,9 +806,7 @@ const transformMap: TransformMap = {
}, },
vertical: { vertical: {
tooltip: 'yLine', tooltip: 'yLine',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper( createCallWrapper(
'yLine', 'yLine',
getInputOfType(args, 'yRelative').expr, getInputOfType(args, 'yRelative').expr,
@ -835,45 +815,35 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLine', tooltip: 'xLine',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper('xLine', args[0].expr, tag), createCallWrapper('xLine', args[0].expr, tag),
}, },
}, },
length: { length: {
vertical: { vertical: {
tooltip: 'yLine', tooltip: 'yLine',
createNode: createNode: ({ inputs, tag, rawArgs: args }) => {
({ inputs, tag }) =>
([arg0]) => {
const expr = inputs[1].expr const expr = inputs[1].expr
if (!(arg0.expr.type === 'Literal' && Number(arg0.expr.value) < 0)) if (
!(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( return createCallWrapper('yLine', createUnaryExpression(expr), tag)
'yLine',
createUnaryExpression(expr),
tag
)
// TODO maybe should return error here instead // TODO maybe should return error here instead
return createCallWrapper('yLine', expr, tag) return createCallWrapper('yLine', expr, tag)
}, },
}, },
horizontal: { horizontal: {
tooltip: 'xLine', tooltip: 'xLine',
createNode: createNode: ({ inputs, tag, rawArgs: args }) => {
({ inputs, tag }) =>
([arg0]) => {
const expr = inputs[1].expr const expr = inputs[1].expr
if (!(arg0.expr.type === 'Literal' && Number(arg0.expr.value) < 0)) if (
!(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( return createCallWrapper('xLine', createUnaryExpression(expr), tag)
'xLine',
createUnaryExpression(expr),
tag
)
// TODO maybe should return error here instead // TODO maybe should return error here instead
return createCallWrapper('xLine', expr, tag) return createCallWrapper('xLine', expr, tag)
}, },
@ -896,9 +866,7 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLine', tooltip: 'xLine',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper('xLine', args[0].expr, tag), createCallWrapper('xLine', args[0].expr, tag),
}, },
}, },
@ -911,13 +879,12 @@ const transformMap: TransformMap = {
xRelative: { xRelative: {
equalLength: { equalLength: {
tooltip: 'angledLineOfXLength', tooltip: 'angledLineOfXLength',
createNode: ({ referenceSegName, inputs, tag }) => { createNode: ({ referenceSegName, inputs, tag, rawArgs: args }) => {
const [minVal, legAngle] = getMinAndSegAngVals( const [minVal, legAngle] = getMinAndSegAngVals(
referenceSegName, referenceSegName,
getInputOfType(inputs, 'xRelative').expr getInputOfType(inputs, 'xRelative').expr
) )
return (args) => return createCallWrapper(
createCallWrapper(
'angledLineOfXLength', 'angledLineOfXLength',
[getLegAng(args[0].expr, legAngle), minVal], [getLegAng(args[0].expr, legAngle), minVal],
tag tag
@ -926,18 +893,14 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLine', tooltip: 'xLine',
createNode: createNode: ({ inputs, tag, rawArgs: args }) => {
({ inputs, tag }) =>
([arg0]) => {
const expr = inputs[1].expr const expr = inputs[1].expr
if (!(arg0.expr.type === 'Literal' && Number(arg0.expr.value) < 0)) if (
!(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( return createCallWrapper('xLine', createUnaryExpression(expr), tag)
'xLine',
createUnaryExpression(expr),
tag
)
// TODO maybe should return error here instead // TODO maybe should return error here instead
return createCallWrapper('xLine', expr, tag) return createCallWrapper('xLine', expr, tag)
}, },
@ -952,9 +915,7 @@ const transformMap: TransformMap = {
}, },
vertical: { vertical: {
tooltip: 'yLine', tooltip: 'yLine',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper( createCallWrapper(
'yLine', 'yLine',
getInputOfType(args, 'yRelative').expr, getInputOfType(args, 'yRelative').expr,
@ -971,14 +932,13 @@ const transformMap: TransformMap = {
yRelative: { yRelative: {
equalLength: { equalLength: {
tooltip: 'angledLineOfYLength', tooltip: 'angledLineOfYLength',
createNode: ({ referenceSegName, inputs, tag }) => { createNode: ({ referenceSegName, inputs, tag, rawArgs: args }) => {
const [minVal, legAngle] = getMinAndSegAngVals( const [minVal, legAngle] = getMinAndSegAngVals(
referenceSegName, referenceSegName,
inputs[1].expr, inputs[1].expr,
'legAngY' 'legAngY'
) )
return (args) => return createCallWrapper(
createCallWrapper(
'angledLineOfXLength', 'angledLineOfXLength',
[getLegAng(args[0].expr, legAngle), minVal], [getLegAng(args[0].expr, legAngle), minVal],
tag tag
@ -987,18 +947,14 @@ const transformMap: TransformMap = {
}, },
vertical: { vertical: {
tooltip: 'yLine', tooltip: 'yLine',
createNode: createNode: ({ inputs, tag, rawArgs: args }) => {
({ inputs, tag }) =>
([arg0]) => {
const expr = inputs[1].expr const expr = inputs[1].expr
if (!(arg0.expr.type === 'Literal' && Number(arg0.expr.value) < 0)) if (
!(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( return createCallWrapper('yLine', createUnaryExpression(expr), tag)
'yLine',
createUnaryExpression(expr),
tag
)
// TODO maybe should return error here instead // TODO maybe should return error here instead
return createCallWrapper('yLine', expr, tag) return createCallWrapper('yLine', expr, tag)
}, },
@ -1013,9 +969,7 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLineTo', tooltip: 'xLineTo',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper('xLineTo', args[0].expr, tag), createCallWrapper('xLineTo', args[0].expr, tag),
}, },
}, },
@ -1028,9 +982,7 @@ const transformMap: TransformMap = {
xAbsolute: { xAbsolute: {
equalLength: { equalLength: {
tooltip: 'angledLineToX', tooltip: 'angledLineToX',
createNode: createNode: ({ referenceSegName, inputs, tag, rawArgs: args }) => {
({ referenceSegName, inputs, tag }) =>
(args) => {
const angleToMatchLengthXCall = createCallExpression( const angleToMatchLengthXCall = createCallExpression(
'angleToMatchLengthX', 'angleToMatchLengthX',
[ [
@ -1051,9 +1003,7 @@ const transformMap: TransformMap = {
}, },
horizontal: { horizontal: {
tooltip: 'xLineTo', tooltip: 'xLineTo',
createNode: createNode: ({ inputs, tag }) =>
({ inputs, tag }) =>
([arg0]) =>
createCallWrapper('xLineTo', inputs[1].expr, tag), createCallWrapper('xLineTo', inputs[1].expr, tag),
}, },
}, },
@ -1066,9 +1016,7 @@ const transformMap: TransformMap = {
}, },
vertical: { vertical: {
tooltip: 'yLineTo', tooltip: 'yLineTo',
createNode: createNode: ({ tag, rawArgs: args }) =>
({ tag }) =>
(args) =>
createCallWrapper( createCallWrapper(
'yLineTo', 'yLineTo',
getInputOfType(args, 'yAbsolute').expr, getInputOfType(args, 'yAbsolute').expr,
@ -1085,9 +1033,7 @@ const transformMap: TransformMap = {
yAbsolute: { yAbsolute: {
equalLength: { equalLength: {
tooltip: 'angledLineToY', tooltip: 'angledLineToY',
createNode: createNode: ({ referenceSegName, inputs, tag, rawArgs: args }) => {
({ referenceSegName, inputs, tag }) =>
(args) => {
const angleToMatchLengthXCall = createCallExpression( const angleToMatchLengthXCall = createCallExpression(
'angleToMatchLengthY', 'angleToMatchLengthY',
[ [
@ -1108,9 +1054,7 @@ const transformMap: TransformMap = {
}, },
vertical: { vertical: {
tooltip: 'yLineTo', tooltip: 'yLineTo',
createNode: createNode: ({ inputs, tag }) =>
({ inputs, tag }) =>
() =>
createCallWrapper('yLineTo', inputs[1].expr, tag), createCallWrapper('yLineTo', inputs[1].expr, tag),
}, },
}, },
@ -1119,13 +1063,10 @@ const transformMap: TransformMap = {
free: { free: {
equalLength: { equalLength: {
tooltip: 'xLine', tooltip: 'xLine',
createNode: createNode: ({ referenceSegName, tag, rawArgs: args }) => {
({ referenceSegName, tag }) => const argVal = getArgLiteralVal(args[0].expr)
(arg) => {
const argVal = getArgLiteralVal(arg[0].expr)
const segLen = createSegLen(referenceSegName) // as BinaryPart const segLen = createSegLen(referenceSegName) // as BinaryPart
if (argVal > 0) if (argVal > 0) return createCallWrapper('xLine', segLen, tag, argVal)
return createCallWrapper('xLine', segLen, tag, argVal)
if (isExprBinaryPart(segLen)) if (isExprBinaryPart(segLen))
return createCallWrapper( return createCallWrapper(
'xLine', 'xLine',
@ -1159,10 +1100,8 @@ const transformMap: TransformMap = {
free: { free: {
equalLength: { equalLength: {
tooltip: 'yLine', tooltip: 'yLine',
createNode: createNode: ({ referenceSegName, tag, rawArgs: args }) => {
({ referenceSegName, tag }) => const argVal = getArgLiteralVal(args[0].expr)
(arg) => {
const argVal = getArgLiteralVal(arg[0].expr)
let segLen = createSegLen(referenceSegName) as BinaryPart let segLen = createSegLen(referenceSegName) as BinaryPart
if (argVal < 0) segLen = createUnaryExpression(segLen) if (argVal < 0) segLen = createUnaryExpression(segLen)
return createCallWrapper('yLine', segLen, tag, argVal) return createCallWrapper('yLine', segLen, tag, argVal)
@ -1190,9 +1129,7 @@ const transformMap: TransformMap = {
free: { free: {
equalLength: { equalLength: {
tooltip: 'xLine', tooltip: 'xLine',
createNode: createNode: ({ referenceSegName, tag }) =>
({ referenceSegName, tag }) =>
() =>
createCallWrapper('xLine', createSegLen(referenceSegName), tag), createCallWrapper('xLine', createSegLen(referenceSegName), tag),
}, },
setLength: { setLength: {
@ -1205,9 +1142,7 @@ const transformMap: TransformMap = {
free: { free: {
equalLength: { equalLength: {
tooltip: 'yLine', tooltip: 'yLine',
createNode: createNode: ({ referenceSegName, tag }) =>
({ referenceSegName, tag }) =>
() =>
createCallWrapper('yLine', createSegLen(referenceSegName), tag), createCallWrapper('yLine', createSegLen(referenceSegName), tag),
}, },
setLength: { setLength: {
@ -1243,9 +1178,7 @@ export function getRemoveConstraintsTransform(
const transformInfo: TransformInfo = { const transformInfo: TransformInfo = {
tooltip: 'line', tooltip: 'line',
// tooltip: name, // tooltip: name,
createNode: createNode: ({ tag, referenceSegName, rawArgs: args }) => {
({ tag, referenceSegName }) =>
(args) => {
return createCallWrapper('line', [args[0].expr, args[1].expr], tag) return createCallWrapper('line', [args[0].expr, args[1].expr], tag)
// The following commented changes values to hardcode, but keeps the line type the same, maybe that's useful? // The following commented changes values to hardcode, but keeps the line type the same, maybe that's useful?
@ -1319,9 +1252,7 @@ export function removeSingleConstraint({
const transform: TransformInfo = { const transform: TransformInfo = {
tooltip: callExp.node.callee.name as any, tooltip: callExp.node.callee.name as any,
createNode: createNode: ({ tag, inputs, rawArgs }) => {
({ tag, inputs }) =>
(rawValues) => {
// inputs is the current values for each of the inputs // inputs is the current values for each of the inputs
// rawValues is the rav 'literal' values equivalent to the inputs // rawValues is the rav 'literal' values equivalent to the inputs
// inputDetails is the one variable we're removing the constraint from // inputDetails is the one variable we're removing the constraint from
@ -1337,7 +1268,7 @@ export function removeSingleConstraint({
) )
) )
return arg.expr return arg.expr
const literal = rawValues.find( const literal = rawArgs.find(
(rawValue) => (rawValue) =>
(rawValue.type === 'arrayItem' || (rawValue.type === 'arrayItem' ||
rawValue.type === 'arrayOrObjItem') && rawValue.type === 'arrayOrObjItem') &&
@ -1366,14 +1297,13 @@ export function removeSingleConstraint({
arg.type !== 'arrayInObject' arg.type !== 'arrayInObject'
) )
return return
const rawLiteralArrayInObject = rawValues.find( const rawLiteralArrayInObject = rawArgs.find(
(rawValue) => (rawValue) =>
rawValue.type === 'arrayInObject' && rawValue.type === 'arrayInObject' &&
rawValue.key === inputDetails.key && rawValue.key === inputDetails.key &&
rawValue.index === rawValue.index === (arg.type === 'arrayInObject' ? arg.index : -1)
(arg.type === 'arrayInObject' ? arg.index : -1)
) )
const rawLiteralObjProp = rawValues.find( const rawLiteralObjProp = rawArgs.find(
(rawValue) => (rawValue) =>
(rawValue.type === 'objectProperty' || (rawValue.type === 'objectProperty' ||
rawValue.type === 'arrayOrObjItem' || rawValue.type === 'arrayOrObjItem' ||
@ -1388,9 +1318,8 @@ export function removeSingleConstraint({
) { ) {
if (!arrayDetailsNameBetterLater[arg.key]) if (!arrayDetailsNameBetterLater[arg.key])
arrayDetailsNameBetterLater[arg.key] = [] arrayDetailsNameBetterLater[arg.key] = []
arrayDetailsNameBetterLater[inputDetails.key][ arrayDetailsNameBetterLater[inputDetails.key][inputDetails.index] =
inputDetails.index rawLiteralArrayInObject.expr
] = rawLiteralArrayInObject.expr
} else if ( } else if (
inputDetails.type === 'objectProperty' && inputDetails.type === 'objectProperty' &&
(rawLiteralObjProp?.type === 'objectProperty' || (rawLiteralObjProp?.type === 'objectProperty' ||
@ -1407,13 +1336,10 @@ export function removeSingleConstraint({
otherThing[arg.key] = arg.expr otherThing[arg.key] = arg.expr
} }
}) })
const createObjParam: Parameters<typeof createObjectExpression>[0] = const createObjParam: Parameters<typeof createObjectExpression>[0] = {}
{} Object.entries(arrayDetailsNameBetterLater).forEach(([key, value]) => {
Object.entries(arrayDetailsNameBetterLater).forEach(
([key, value]) => {
createObjParam[key] = createArrayExpression(value) createObjParam[key] = createArrayExpression(value)
} })
)
const objExp = createObjectExpression({ const objExp = createObjectExpression({
...createObjParam, ...createObjParam,
...otherThing, ...otherThing,
@ -1427,7 +1353,7 @@ export function removeSingleConstraint({
return createCallWrapper( return createCallWrapper(
callExp.node.callee.name as any, callExp.node.callee.name as any,
rawValues[0].expr, rawArgs[0].expr,
tag tag
) )
}, },
@ -1818,11 +1744,15 @@ export function transformAstSketchLines({
to, to,
from, from,
}, },
createCallback: callBack({
createCallback: (rawArgs) =>
callBack({
referenceSegName: _referencedSegmentName, referenceSegName: _referencedSegmentName,
inputs, inputs,
tag: callBackTag, tag: callBackTag,
rawArgs,
forceValueUsedInTransform, forceValueUsedInTransform,
referencedSegment,
}), }),
}) })
if (err(replacedSketchLine)) return replacedSketchLine if (err(replacedSketchLine)) return replacedSketchLine

View File

@ -69,7 +69,7 @@ interface addCall extends ModifyAstBase {
segmentInput: SegmentInputs segmentInput: SegmentInputs
referencedSegment?: Path referencedSegment?: Path
replaceExisting?: boolean replaceExisting?: boolean
createCallback?: TransformCallback // TODO: #29 probably should not be optional createCallback?: (rawArgs: RawArgs) => ReturnType<CreateStdLibSketchCallExpr>
/// defaults to false, normal behavior is to add a new callExpression to the end of the pipeExpression /// defaults to false, normal behavior is to add a new callExpression to the end of the pipeExpression
spliceBetween?: boolean spliceBetween?: boolean
} }
@ -149,13 +149,13 @@ type RawArg = _VarValue<Literal>
export type InputArgs = Array<InputArg> export type InputArgs = Array<InputArg>
// /** /**
// * The literal equivalent of whatever current expression is * The literal equivalent of whatever current expression is
// * i.e. if the expression is 5 + 6, the literal would be 11 * i.e. if the expression is 5 + 6, the literal would be 11
// * but of course works for expressions like myVar + someFn() etc too * but of course works for expressions like myVar + someFn() etc too
// * This is useful in cases where we want to "un-constrain" inputs to segments * This is useful in cases where we want to "un-constrain" inputs to segments
// */ */
type RawArgs = Array<RawArg> export type RawArgs = Array<RawArg>
/** /**
* Serves the same role as {@link InputArg} on {@link RawArg} * Serves the same role as {@link InputArg} on {@link RawArg}
@ -174,14 +174,23 @@ export type SimplifiedArgDetails =
index: 0 | 1 index: 0 | 1
} }
export type TransformCallback = ( export type CreateStdLibSketchCallExpr = (args: {
inputs: InputArgs, inputs: InputArgs
referenceSegName: string
tag?: Expr
forceValueUsedInTransform?: Expr
rawArgs: InputArgs
referencedSegment?: Path referencedSegment?: Path
) => { }) => {
callExp: Expr callExp: Expr
valueUsedInTransform?: number valueUsedInTransform?: number
} }
export type TransformInfo = {
tooltip: ToolTip
createNode: CreateStdLibSketchCallExpr
}
export interface ConstrainInfo { export interface ConstrainInfo {
stdLibFnName: ToolTip stdLibFnName: ToolTip
type: type: