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,
getTransformInfos,
PathToNodeMap,
TransformInfo,
} from '../../lang/std/sketchcombos'
import { kclManager } from 'lib/singletons'
import { err } from 'lib/trap'
import { TransformInfo } from 'lang/std/stdTypes'
export function equalAngleInfo({
selectionRanges,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -69,7 +69,7 @@ interface addCall extends ModifyAstBase {
segmentInput: SegmentInputs
referencedSegment?: Path
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
spliceBetween?: boolean
}
@ -149,13 +149,13 @@ type RawArg = _VarValue<Literal>
export type InputArgs = Array<InputArg>
// /**
// * The literal equivalent of whatever current expression is
// * i.e. if the expression is 5 + 6, the literal would be 11
// * 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
// */
type RawArgs = Array<RawArg>
/**
* The literal equivalent of whatever current expression is
* i.e. if the expression is 5 + 6, the literal would be 11
* 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
*/
export type RawArgs = Array<RawArg>
/**
* Serves the same role as {@link InputArg} on {@link RawArg}
@ -174,14 +174,23 @@ export type SimplifiedArgDetails =
index: 0 | 1
}
export type TransformCallback = (
inputs: InputArgs,
export type CreateStdLibSketchCallExpr = (args: {
inputs: InputArgs
referenceSegName: string
tag?: Expr
forceValueUsedInTransform?: Expr
rawArgs: InputArgs
referencedSegment?: Path
) => {
}) => {
callExp: Expr
valueUsedInTransform?: number
}
export type TransformInfo = {
tooltip: ToolTip
createNode: CreateStdLibSketchCallExpr
}
export interface ConstrainInfo {
stdLibFnName: ToolTip
type: