initial set horz-vert distance constraint (#42)

inital set horz-vert distance constraint
This commit is contained in:
Kurt Hutten
2023-03-05 07:34:56 +11:00
committed by GitHub
parent 68dbe8e035
commit 4c554b6549
8 changed files with 357 additions and 32 deletions

View File

@ -21,8 +21,9 @@ import {
giveSketchFnCallTag,
} from '../modifyAst'
import { createFirstArg, getFirstArg, replaceSketchLine } from './sketch'
import { ProgramMemory } from '../executor'
import { Path, ProgramMemory } from '../executor'
import { getSketchSegmentIndexFromSourceRange } from './sketchConstraints'
import { roundOff } from '../../lib/utils'
type LineInputsType =
| 'xAbsolute'
@ -37,6 +38,8 @@ export type ConstraintType =
| 'vertical'
| 'horizontal'
| 'equalangle'
| 'setHorzDistance'
| 'setVertDistance'
function createCallWrapper(
a: TooTip,
@ -54,7 +57,8 @@ export function replaceSketchCall(
ast: Program,
range: Range,
transformTo: TooTip,
createCallback: TransformCallback
createCallback: TransformCallback,
referenceSegName: string
): { modifiedAst: Program } {
const path = getNodePathFromSourceRange(ast, range)
const getNode = getNodeFromPathCurry(ast, path)
@ -65,11 +69,15 @@ export function replaceSketchCall(
if (!sketchGroup || sketchGroup.type !== 'sketchGroup')
throw new Error('not a sketch group')
const seg = getSketchSegmentIndexFromSourceRange(sketchGroup, range)
const referencedSegment = sketchGroup.value.find(
(path) => path.name === referenceSegName
)
const { to, from } = seg
const { modifiedAst } = replaceSketchLine({
node: ast,
programMemory,
sourceRange: range,
referencedSegment,
fnName: transformTo || (callExp.callee.name as TooTip),
to,
from,
@ -85,7 +93,7 @@ export type TransformInfo = {
varValB: Value // y / length or x y for angledLineOfXlength etc
referenceSegName: string
tag?: Value
}) => (args: [Value, Value]) => Value
}) => (args: [Value, Value], referencedSegment?: Path) => Value
}
type TransformMap = {
@ -163,6 +171,57 @@ const getAngleLengthSign = (arg: Value, legAngleVal: BinaryPart) => {
return normalisedAngle > 90 ? createUnaryExpression(legAngleVal) : legAngleVal
}
const setHorzVertDistanceCreateNode =
(isX = true): TransformInfo['createNode'] =>
({ referenceSegName, tag }) => {
return (args, referencedSegment) => {
const makeBinExp = (index: 0 | 1) => {
const arg = getArgLiteralVal(args?.[index])
return createBinaryExpression([
createSegEnd(referenceSegName, isX),
'+',
createLiteral(
roundOff(arg - (referencedSegment?.to?.[index] || 0), 2)
),
])
}
return createCallWrapper(
'lineTo',
isX ? [makeBinExp(0), args[1]] : [args[0], makeBinExp(1)],
tag
)
}
}
const setHorzVertDistanceConstraintLineCreateNode =
(isX: boolean): TransformInfo['createNode'] =>
({ referenceSegName, tag, varValA, varValB }) => {
const varVal = (isX ? varValB : varValA) as BinaryPart
const varValBinExp = createBinaryExpression([
createLastSeg(!isX),
'+',
varVal,
])
return (args, referencedSegment) => {
const makeBinExp = (index: 0 | 1) => {
const arg = getArgLiteralVal(args?.[index])
return createBinaryExpression([
createSegEnd(referenceSegName, isX),
'+',
createLiteral(
roundOff(arg - (referencedSegment?.to?.[index] || 0), 2)
),
])
}
return createCallWrapper(
'lineTo',
isX ? [makeBinExp(0), varValBinExp] : [varValBinExp, makeBinExp(1)],
tag
)
}
}
const transformMap: TransformMap = {
line: {
xRelative: {
@ -188,6 +247,10 @@ const transformMap: TransformMap = {
() =>
createCallWrapper('xLine', varValA, tag),
},
setVertDistance: {
tooltip: 'lineTo',
createNode: setHorzVertDistanceConstraintLineCreateNode(false),
},
},
yRelative: {
equalLength: {
@ -212,6 +275,10 @@ const transformMap: TransformMap = {
() =>
createCallWrapper('yLine', varValB, tag),
},
setHorzDistance: {
tooltip: 'lineTo',
createNode: setHorzVertDistanceConstraintLineCreateNode(true),
},
},
free: {
equalLength: {
@ -232,6 +299,14 @@ const transformMap: TransformMap = {
(args) =>
createCallWrapper('yLine', args[1], tag),
},
setHorzDistance: {
tooltip: 'lineTo',
createNode: setHorzVertDistanceCreateNode(true),
},
setVertDistance: {
tooltip: 'lineTo',
createNode: setHorzVertDistanceCreateNode(false),
},
},
},
lineTo: {
@ -792,7 +867,8 @@ export function transformAstForSketchLines({
referenceSegName: tag,
varValA,
varValB,
})
}),
tag
)
node = modifiedAst
})
@ -837,7 +913,8 @@ export function transformAstForHorzVert({
varValA,
varValB,
tag,
})
}),
tag?.type === 'Literal' ? String(tag.value) : ''
)
node = modifiedAst
})
@ -850,3 +927,20 @@ function createSegLen(referenceSegName: string): Value {
createPipeSubstitution(),
])
}
function createSegEnd(referenceSegName: string, isX: boolean): CallExpression {
return createCallExpression(isX ? 'segEndX' : 'segEndY', [
createLiteral(referenceSegName),
createPipeSubstitution(),
])
}
function createLastSeg(isX: boolean): CallExpression {
return createCallExpression(isX ? 'lastSegX' : 'lastSegY', [
createPipeSubstitution(),
])
}
function getArgLiteralVal(arg: Value): number {
return arg?.type === 'Literal' ? Number(arg.value) : 0
}