Add intersect constraint UI (#71)

* Add intersect constraint UI

* add more combos for intersect constraint
This commit is contained in:
Kurt Hutten
2023-03-19 18:46:39 +11:00
committed by GitHub
parent 0995780abb
commit 22c356a841
9 changed files with 439 additions and 78 deletions

View File

@ -17,6 +17,7 @@ import {
createCallExpression,
createIdentifier,
createLiteral,
createObjectExpression,
createPipeSubstitution,
createUnaryExpression,
giveSketchFnCallTag,
@ -43,6 +44,7 @@ export type ConstraintType =
| 'setVertDistance'
| 'setAngle'
| 'setLength'
| 'intersect'
function createCallWrapper(
a: TooTip,
@ -59,6 +61,38 @@ function createCallWrapper(
}
}
function intersectCallWrapper({
fnName,
angleVal,
offsetVal,
intersectTag,
tag,
valueUsedInTransform,
}: {
fnName: string
angleVal: Value
offsetVal: Value
intersectTag: Value
tag?: Value
valueUsedInTransform?: number
}): ReturnType<TransformCallback> {
const firstArg: any = {
angle: angleVal,
offset: offsetVal,
intersectTag,
}
if (tag) {
firstArg['tag'] = tag
}
return {
callExp: createCallExpression(fnName, [
createObjectExpression(firstArg),
createPipeSubstitution(),
]),
valueUsedInTransform,
}
}
export type TransformInfo = {
tooltip: TooTip
createNode: (a: {
@ -71,7 +105,7 @@ export type TransformInfo = {
}
type TransformMap = {
[key in TooTip]: {
[key in TooTip]?: {
[key in LineInputsType | 'free']?: {
[key in ConstraintType]?: TransformInfo
}
@ -307,6 +341,44 @@ const setHorzVertDistanceConstraintLineCreateNode =
}
}
const setAngledIntersectLineForLines: TransformInfo['createNode'] =
({ referenceSegName, tag, forceValueUsedInTransform }) =>
(args) => {
const valueUsedInTransform = roundOff(
args[1].type === 'Literal' ? Number(args[1].value) : 0,
2
)
const angle = args[0].type === 'Literal' ? Number(args[0].value) : 0
return intersectCallWrapper({
fnName: 'angledLineThatIntersects',
angleVal: createLiteral(angle),
offsetVal:
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
intersectTag: createLiteral(referenceSegName),
tag,
valueUsedInTransform,
})
}
const setAngledIntersectForAngledLines: TransformInfo['createNode'] =
({ referenceSegName, tag, forceValueUsedInTransform, varValA }) =>
(args) => {
const valueUsedInTransform = roundOff(
args[1].type === 'Literal' ? Number(args[1].value) : 0,
2
)
// const angle = args[0].type === 'Literal' ? Number(args[0].value) : 0
return intersectCallWrapper({
fnName: 'angledLineThatIntersects',
angleVal: varValA,
offsetVal:
forceValueUsedInTransform || createLiteral(valueUsedInTransform),
intersectTag: createLiteral(referenceSegName),
tag,
valueUsedInTransform,
})
}
const transformMap: TransformMap = {
line: {
xRelative: {
@ -404,6 +476,10 @@ const transformMap: TransformMap = {
tooltip: 'angledLine',
createNode: basicAngledLineCreateNode('ang'),
},
intersect: {
tooltip: 'angledLineThatIntersects',
createNode: setAngledIntersectLineForLines,
},
},
},
lineTo: {
@ -524,6 +600,10 @@ const transformMap: TransformMap = {
tooltip: 'angledLineToX',
createNode: setHorzVertDistanceForAngleLineCreateNode('x'),
},
intersect: {
tooltip: 'angledLineThatIntersects',
createNode: setAngledIntersectForAngledLines,
},
},
free: {
equalLength: {
@ -798,6 +878,10 @@ const transformMap: TransformMap = {
tooltip: 'xLine',
createNode: xyLineSetLength('xLine'),
},
intersect: {
tooltip: 'angledLineThatIntersects',
createNode: setAngledIntersectLineForLines,
},
},
},
yLine: {
@ -817,6 +901,10 @@ const transformMap: TransformMap = {
tooltip: 'yLineTo',
createNode: setHorVertDistanceForXYLines('y'),
},
intersect: {
tooltip: 'angledLineThatIntersects',
createNode: setAngledIntersectLineForLines,
},
},
},
xLineTo: {