diff --git a/src/Toolbar.tsx b/src/Toolbar.tsx index 27de50586..76f032a4a 100644 --- a/src/Toolbar.tsx +++ b/src/Toolbar.tsx @@ -6,9 +6,10 @@ import { RemoveConstrainingValues } from './components/Toolbar/RemoveConstrainin import { EqualLength } from './components/Toolbar/EqualLength' import { EqualAngle } from './components/Toolbar/EqualAngle' import { Intersect } from './components/Toolbar/Intersect' -import { SetHorzDistance } from './components/Toolbar/SetHorzDistance' +import { SetHorzVertDistance } from './components/Toolbar/SetHorzVertDistance' import { SetAngleLength } from './components/Toolbar/SetAngleLength' import { ConvertToVariable } from './components/Toolbar/ConvertVariable' +import { SetAbsDistance } from './components/Toolbar/SetAbsDistance' export const Toolbar = () => { const { @@ -169,8 +170,10 @@ export const Toolbar = () => { - - + + + + diff --git a/src/components/Toolbar/SetAbsDistance.tsx b/src/components/Toolbar/SetAbsDistance.tsx new file mode 100644 index 000000000..c034e1396 --- /dev/null +++ b/src/components/Toolbar/SetAbsDistance.tsx @@ -0,0 +1,123 @@ +import { useState, useEffect } from 'react' +import { create } from 'react-modal-promise' +import { toolTips, useStore } from '../../useStore' +import { Value } from '../../lang/abstractSyntaxTree' +import { + getNodePathFromSourceRange, + getNodeFromPath, +} from '../../lang/queryAst' +import { + TransformInfo, + getTransformInfos, + transformAstSketchLines, +} from '../../lang/std/sketchcombos' +import { SetAngleLengthModal } from '../SetAngleLengthModal' +import { createVariableDeclaration } from '../../lang/modifyAst' +import { removeDoubleNegatives } from '../AvailableVarsHelpers' + +const getModalInfo = create(SetAngleLengthModal as any) + +export const SetAbsDistance = ({ disType }: { disType: 'xAbs' | 'yAbs' }) => { + const { + guiMode, + selectionRanges: selections, + ast, + programMemory, + updateAst, + } = useStore((s) => ({ + guiMode: s.guiMode, + ast: s.ast, + updateAst: s.updateAst, + selectionRanges: s.selectionRanges, + programMemory: s.programMemory, + })) + const [enableAngLen, setEnableAngLen] = useState(false) + const [transformInfos, setTransformInfos] = useState() + useEffect(() => { + if (!ast) return + const paths = selections.codeBasedSelections.map(({ range }) => + getNodePathFromSourceRange(ast, range) + ) + const nodes = paths.map( + (pathToNode) => + getNodeFromPath(ast, pathToNode, 'CallExpression').node + ) + const isAllTooltips = nodes.every( + (node) => + node?.type === 'CallExpression' && + toolTips.includes(node.callee.name as any) + ) + + const theTransforms = getTransformInfos(selections, ast, disType) + setTransformInfos(theTransforms) + + const enableY = + disType === 'yAbs' && + selections.otherSelections.length === 1 && + selections.otherSelections[0] === 'x-axis' // select the x axis to set the distance from it i.e. y + const enableX = + disType === 'xAbs' && + selections.otherSelections.length === 1 && + selections.otherSelections[0] === 'y-axis' // select the y axis to set the distance from it i.e. x + + const _enableHorz = + isAllTooltips && + theTransforms.every(Boolean) && + selections.codeBasedSelections.length === 1 && + (enableX || enableY) + setEnableAngLen(_enableHorz) + }, [guiMode, selections]) + if (guiMode.mode !== 'sketch') return null + + return ( + + ) +} diff --git a/src/components/Toolbar/SetHorzDistance.tsx b/src/components/Toolbar/SetHorzVertDistance.tsx similarity index 99% rename from src/components/Toolbar/SetHorzDistance.tsx rename to src/components/Toolbar/SetHorzVertDistance.tsx index e6e66cc88..6bf9baf8a 100644 --- a/src/components/Toolbar/SetHorzDistance.tsx +++ b/src/components/Toolbar/SetHorzVertDistance.tsx @@ -25,7 +25,7 @@ import { removeDoubleNegatives } from '../AvailableVarsHelpers' const getModalInfo = create(GetInfoModal as any) -export const SetHorzDistance = ({ +export const SetHorzVertDistance = ({ horOrVert, }: { horOrVert: 'setHorzDistance' | 'setVertDistance' diff --git a/src/lang/std/sketchcombos.ts b/src/lang/std/sketchcombos.ts index 7773763d7..355b1befa 100644 --- a/src/lang/std/sketchcombos.ts +++ b/src/lang/std/sketchcombos.ts @@ -13,7 +13,6 @@ import { getNodePathFromSourceRange, } from '../queryAst' import { - createBinaryExpression, createBinaryExpressionWithUnary, createCallExpression, createIdentifier, @@ -47,6 +46,8 @@ export type ConstraintType = | 'setLength' | 'intersect' | 'removeConstrainingValues' + | 'xAbs' + | 'yAbs' function createCallWrapper( a: TooTip, @@ -287,6 +288,61 @@ const setHorzVertDistanceForAngleLineCreateNode = } } +const setAbsDistanceCreateNode = + ( + xOrY: 'x' | 'y', + isXOrYLine = false, + index = xOrY === 'x' ? 0 : 1 + ): TransformInfo['createNode'] => + ({ tag, forceValueUsedInTransform, ...rest }) => { + return (args, referencedSegment, ...rest2) => { + const valueUsedInTransform = roundOff( + getArgLiteralVal(args?.[index]) - (referencedSegment?.to?.[index] || 0), + 2 + ) + console.log(rest, rest2) + const val = + (forceValueUsedInTransform as BinaryPart) || + createLiteral(valueUsedInTransform) + if (isXOrYLine) { + return createCallWrapper( + xOrY === 'x' ? 'xLineTo' : 'yLineTo', + val, + tag, + valueUsedInTransform + ) + } + return createCallWrapper( + 'lineTo', + !index ? [val, args[1]] : [args[0], val], + tag, + valueUsedInTransform + ) + } + } +const setAbsDistanceForAngleLineCreateNode = + ( + xOrY: 'x' | 'y', + index = xOrY === 'x' ? 0 : 1 + ): TransformInfo['createNode'] => + ({ tag, forceValueUsedInTransform, varValA }) => { + return (args, referencedSegment) => { + const valueUsedInTransform = roundOff( + getArgLiteralVal(args?.[1]) - (referencedSegment?.to?.[index] || 0), + 2 + ) + const val = + (forceValueUsedInTransform as BinaryPart) || + createLiteral(valueUsedInTransform) + return createCallWrapper( + xOrY === 'x' ? 'angledLineToX' : 'angledLineToY', + [varValA, val], + tag, + valueUsedInTransform + ) + } + } + const setHorVertDistanceForXYLines = (xOrY: 'x' | 'y'): TransformInfo['createNode'] => ({ referenceSegName, tag, forceValueUsedInTransform }) => { @@ -459,10 +515,18 @@ const transformMap: TransformMap = { tooltip: 'lineTo', createNode: setHorzVertDistanceCreateNode('x'), }, + xAbs: { + tooltip: 'lineTo', + createNode: setAbsDistanceCreateNode('x'), + }, setVertDistance: { tooltip: 'lineTo', createNode: setHorzVertDistanceCreateNode('y'), }, + yAbs: { + tooltip: 'lineTo', + createNode: setAbsDistanceCreateNode('y'), + }, setAngle: { tooltip: 'angledLine', createNode: basicAngledLineCreateNode('none', 'ang'), @@ -595,10 +659,18 @@ const transformMap: TransformMap = { tooltip: 'angledLineToY', createNode: setHorzVertDistanceForAngleLineCreateNode('y'), }, + yAbs: { + tooltip: 'angledLineToY', + createNode: setAbsDistanceForAngleLineCreateNode('y'), + }, setHorzDistance: { tooltip: 'angledLineToX', createNode: setHorzVertDistanceForAngleLineCreateNode('x'), }, + xAbs: { + tooltip: 'angledLineToX', + createNode: setAbsDistanceForAngleLineCreateNode('x'), + }, intersect: { tooltip: 'angledLineThatIntersects', createNode: setAngledIntersectForAngledLines, @@ -881,6 +953,10 @@ const transformMap: TransformMap = { tooltip: 'angledLineThatIntersects', createNode: setAngledIntersectLineForLines, }, + xAbs: { + tooltip: 'xLineTo', + createNode: setAbsDistanceCreateNode('x', true), + }, }, }, yLine: { @@ -908,6 +984,10 @@ const transformMap: TransformMap = { tooltip: 'angledLineThatIntersects', createNode: setAngledIntersectLineForLines, }, + yAbs: { + tooltip: 'yLineTo', + createNode: setAbsDistanceCreateNode('y', true), + }, }, }, xLineTo: {