Compare commits
	
		
			2 Commits
		
	
	
		
			franknoiro
			...
			kurt-refac
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| dc9000f6c7 | |||
| 70694d9dd3 | 
| @ -22,6 +22,7 @@ import { | ||||
| } from 'lib/toolbar' | ||||
| import { isDesktop } from 'lib/isDesktop' | ||||
| import { openExternalBrowserIfDesktop } from 'lib/openWindow' | ||||
| import { convertSelectionsToOld } from 'lib/selections' | ||||
|  | ||||
| export function Toolbar({ | ||||
|   className = '', | ||||
| @ -38,12 +39,17 @@ export function Toolbar({ | ||||
|     '!border-transparent hover:!border-chalkboard-20 dark:enabled:hover:!border-primary pressed:!border-primary ui-open:!border-primary' | ||||
|  | ||||
|   const sketchPathId = useMemo(() => { | ||||
|     if (!isSingleCursorInPipe(context.selectionRanges, kclManager.ast)) { | ||||
|     if ( | ||||
|       !isSingleCursorInPipe( | ||||
|         convertSelectionsToOld(context.selectionRanges), | ||||
|         kclManager.ast | ||||
|       ) | ||||
|     ) { | ||||
|       return false | ||||
|     } | ||||
|     return isCursorInSketchCommandRange( | ||||
|       engineCommandManager.artifactGraph, | ||||
|       context.selectionRanges | ||||
|       convertSelectionsToOld(context.selectionRanges) | ||||
|     ) | ||||
|   }, [engineCommandManager.artifactGraph, context.selectionRanges]) | ||||
|  | ||||
|  | ||||
| @ -77,7 +77,7 @@ import { | ||||
|   createPipeSubstitution, | ||||
|   findUniqueName, | ||||
| } from 'lang/modifyAst' | ||||
| import { Selections, getEventForSegmentSelection } from 'lib/selections' | ||||
| import { Selections__old, getEventForSegmentSelection } from 'lib/selections' | ||||
| import { createGridHelper, orthoScale, perspScale } from './helpers' | ||||
| import { Models } from '@kittycad/lib' | ||||
| import { uuidv4 } from 'lib/utils' | ||||
| @ -374,7 +374,7 @@ export class SceneEntities { | ||||
|     forward: [number, number, number] | ||||
|     up: [number, number, number] | ||||
|     position?: [number, number, number] | ||||
|     selectionRanges?: Selections | ||||
|     selectionRanges?: Selections__old | ||||
|   }): Promise<{ | ||||
|     truncatedAst: Program | ||||
|     programMemoryOverride: ProgramMemory | ||||
| @ -1171,6 +1171,7 @@ export class SceneEntities { | ||||
|       }, | ||||
|       onMove: () => {}, | ||||
|       onClick: (args) => { | ||||
|         console.log('onClick', args) | ||||
|         if (args?.mouseEvent.which !== 1) return | ||||
|         if (!args || !args.selected) { | ||||
|           sceneInfra.modelingSend({ | ||||
| @ -1183,6 +1184,7 @@ export class SceneEntities { | ||||
|         } | ||||
|         const { selected } = args | ||||
|         const event = getEventForSegmentSelection(selected) | ||||
|         console.log('event', event) | ||||
|         if (!event) return | ||||
|         sceneInfra.modelingSend(event) | ||||
|       }, | ||||
|  | ||||
| @ -12,6 +12,7 @@ import { useKclContext } from 'lang/KclProvider' | ||||
| import { useModelingContext } from 'hooks/useModelingContext' | ||||
| import { executeAst } from 'lang/langHelpers' | ||||
| import { trap } from 'lib/trap' | ||||
| import { convertSelectionsToOld } from 'lib/selections' | ||||
|  | ||||
| export const AvailableVars = ({ | ||||
|   onVarClick, | ||||
| @ -96,7 +97,8 @@ export function useCalc({ | ||||
| } { | ||||
|   const { programMemory } = useKclContext() | ||||
|   const { context } = useModelingContext() | ||||
|   const selectionRange = context.selectionRanges.codeBasedSelections[0].range | ||||
|   const selectionRange = convertSelectionsToOld(context.selectionRanges) | ||||
|     .codeBasedSelections[0].range | ||||
|   const inputRef = useRef<HTMLInputElement>(null) | ||||
|   const [availableVarInfo, setAvailableVarInfo] = useState< | ||||
|     ReturnType<typeof findAllPreviousVariables> | ||||
|  | ||||
| @ -2,7 +2,7 @@ import { useCommandsContext } from 'hooks/useCommandsContext' | ||||
| import { CustomIcon } from '../CustomIcon' | ||||
| import React, { useState } from 'react' | ||||
| import { ActionButton } from '../ActionButton' | ||||
| import { Selections, getSelectionTypeDisplayText } from 'lib/selections' | ||||
| import { Selections__old, getSelectionTypeDisplayText } from 'lib/selections' | ||||
| import { useHotkeys } from 'react-hotkeys-hook' | ||||
| import { KclCommandValue, KclExpressionWithVariable } from 'lib/commandTypes' | ||||
| import Tooltip from 'components/Tooltip' | ||||
| @ -125,7 +125,9 @@ function CommandBarHeader({ children }: React.PropsWithChildren<{}>) { | ||||
|                     <span data-testid="header-arg-value"> | ||||
|                       {argValue ? ( | ||||
|                         arg.inputType === 'selection' ? ( | ||||
|                           getSelectionTypeDisplayText(argValue as Selections) | ||||
|                           getSelectionTypeDisplayText( | ||||
|                             argValue as Selections__old | ||||
|                           ) | ||||
|                         ) : arg.inputType === 'kcl' ? ( | ||||
|                           roundOff( | ||||
|                             Number( | ||||
|  | ||||
| @ -3,8 +3,10 @@ import { useCommandsContext } from 'hooks/useCommandsContext' | ||||
| import { useKclContext } from 'lang/KclProvider' | ||||
| import { CommandArgument } from 'lib/commandTypes' | ||||
| import { | ||||
|   Selection, | ||||
|   Selection__old, | ||||
|   canSubmitSelectionArg, | ||||
|   convertSelectionToOld, | ||||
|   convertSelectionsToOld, | ||||
|   getSelectionType, | ||||
|   getSelectionTypeDisplayText, | ||||
| } from 'lib/selections' | ||||
| @ -12,13 +14,15 @@ import { modelingMachine } from 'machines/modelingMachine' | ||||
| import { useEffect, useMemo, useRef, useState } from 'react' | ||||
| import { StateFrom } from 'xstate' | ||||
|  | ||||
| const semanticEntityNames: { [key: string]: Array<Selection['type']> } = { | ||||
| const semanticEntityNames: { [key: string]: Array<Selection__old['type']> } = { | ||||
|   face: ['extrude-wall', 'start-cap', 'end-cap'], | ||||
|   edge: ['edge', 'line', 'arc'], | ||||
|   point: ['point', 'line-end', 'line-mid'], | ||||
| } | ||||
|  | ||||
| function getSemanticSelectionType(selectionType: Array<Selection['type']>) { | ||||
| function getSemanticSelectionType( | ||||
|   selectionType: Array<Selection__old['type']> | ||||
| ) { | ||||
|   const semanticSelectionType = new Set() | ||||
|   selectionType.forEach((type) => { | ||||
|     Object.entries(semanticEntityNames).forEach(([entity, entityTypes]) => { | ||||
| @ -49,10 +53,14 @@ function CommandBarSelectionInput({ | ||||
|   const [hasSubmitted, setHasSubmitted] = useState(false) | ||||
|   const selection = useSelector(arg.machineActor, selectionSelector) | ||||
|   const selectionsByType = useMemo(() => { | ||||
|     const selectionRangeEnd = selection?.codeBasedSelections[0]?.range[1] | ||||
|     return !selectionRangeEnd || selectionRangeEnd === code.length | ||||
|     const selectionRangeEnd = !selection | ||||
|       ? null | ||||
|       : convertSelectionsToOld(selection)?.codeBasedSelections[0]?.range[1] | ||||
|     return !selectionRangeEnd || selectionRangeEnd === code.length || !selection | ||||
|       ? 'none' | ||||
|       : getSelectionType(selection) | ||||
|       : !selection | ||||
|       ? 'none' | ||||
|       : getSelectionType(convertSelectionsToOld(selection)) | ||||
|   }, [selection, code]) | ||||
|   const canSubmitSelection = useMemo<boolean>( | ||||
|     () => canSubmitSelectionArg(selectionsByType, arg), | ||||
| @ -87,6 +95,8 @@ function CommandBarSelectionInput({ | ||||
|     onSubmit(selection) | ||||
|   } | ||||
|  | ||||
|   const selectionOld = selection && convertSelectionsToOld(selection) | ||||
|  | ||||
|   return ( | ||||
|     <form id="arg-form" onSubmit={handleSubmit}> | ||||
|       <label | ||||
| @ -96,7 +106,7 @@ function CommandBarSelectionInput({ | ||||
|         } | ||||
|       > | ||||
|         {canSubmitSelection | ||||
|           ? getSelectionTypeDisplayText(selection) + ' selected' | ||||
|           ? getSelectionTypeDisplayText(selectionOld) + ' selected' | ||||
|           : `Please select ${ | ||||
|               arg.multiple ? 'one or more ' : 'one ' | ||||
|             }${getSemanticSelectionType(arg.selectionTypes).join(' or ')}`} | ||||
|  | ||||
| @ -21,6 +21,7 @@ export const EngineCommands = () => { | ||||
|   const [engineCommands, clearEngineCommands] = useEngineCommands() | ||||
|   const [containsFilter, setContainsFilter] = useState('') | ||||
|   const [customCmd, setCustomCmd] = useState('') | ||||
|   console.log(JSON.stringify(engineCommands, null, 2)) | ||||
|   return ( | ||||
|     <div> | ||||
|       <input | ||||
| @ -64,7 +65,10 @@ export const EngineCommands = () => { | ||||
|           ) | ||||
|         })} | ||||
|       </div> | ||||
|       <button data-testid="clear-commands" onClick={clearEngineCommands}> | ||||
|       <button | ||||
|         data-testid="clear-commands" | ||||
|         onClick={() => clearEngineCommands()} | ||||
|       > | ||||
|         Clear | ||||
|       </button> | ||||
|       <br /> | ||||
|  | ||||
| @ -37,13 +37,17 @@ import { | ||||
| } from './Toolbar/SetAngleBetween' | ||||
| import { applyConstraintAngleLength } from './Toolbar/setAngleLength' | ||||
| import { | ||||
|   Selections, | ||||
|   Selections__old, | ||||
|   canSweepSelection, | ||||
|   handleSelectionBatch, | ||||
|   isSelectionLastLine, | ||||
|   isRangeBetweenCharacters, | ||||
|   isSketchPipe, | ||||
|   updateSelections, | ||||
|   convertSelectionsToOld, | ||||
|   convertSelectionToOld, | ||||
|   Selections, | ||||
|   updateSelections2, | ||||
| } from 'lib/selections' | ||||
| import { applyConstraintIntersect } from './Toolbar/Intersect' | ||||
| import { applyConstraintAbsDistance } from './Toolbar/SetAbsDistance' | ||||
| @ -249,6 +253,7 @@ export const ModelingMachineProvider = ({ | ||||
|         'Set selection': assign( | ||||
|           ({ context: { selectionRanges, sketchDetails }, event }) => { | ||||
|             // this was needed for ts after adding 'Set selection' action to on done modal events | ||||
|             // const oldSelections = convertSelectionsToOld(selectionRanges) | ||||
|             const setSelections = | ||||
|               ('data' in event && | ||||
|                 event.data && | ||||
| @ -275,8 +280,12 @@ export const ModelingMachineProvider = ({ | ||||
|                 }) | ||||
|               }) | ||||
|             } | ||||
|             // let selections: Selections__old = { | ||||
|             //   codeBasedSelections: [], | ||||
|             //   otherSelections: [], | ||||
|             // } | ||||
|             let selections: Selections = { | ||||
|               codeBasedSelections: [], | ||||
|               graphSelections: [], | ||||
|               otherSelections: [], | ||||
|             } | ||||
|             if (setSelections.selectionType === 'singleCodeCursor') { | ||||
| @ -286,21 +295,28 @@ export const ModelingMachineProvider = ({ | ||||
|                 !editorManager.isShiftDown | ||||
|               ) { | ||||
|                 selections = { | ||||
|                   codeBasedSelections: [], | ||||
|                   graphSelections: [], | ||||
|                   otherSelections: [], | ||||
|                 } | ||||
|               } else if ( | ||||
|                 setSelections.selection && | ||||
|                 !editorManager.isShiftDown | ||||
|               ) { | ||||
|                 // const oldSelection = convertSelectionToOld(setSelections.selection) | ||||
|                 // if (oldSelection) { | ||||
|  | ||||
|                 // } | ||||
|                 selections = { | ||||
|                   codeBasedSelections: [setSelections.selection], | ||||
|                   graphSelections: [setSelections.selection], | ||||
|                   otherSelections: [], | ||||
|                 } | ||||
|               } else if (setSelections.selection && editorManager.isShiftDown) { | ||||
|                 // const oldSelection = convertSelectionToOld(setSelections.selection) | ||||
|                 // if (oldSelection) { | ||||
|                 // } | ||||
|                 selections = { | ||||
|                   codeBasedSelections: [ | ||||
|                     ...selectionRanges.codeBasedSelections, | ||||
|                   graphSelections: [ | ||||
|                     ...selectionRanges.graphSelections, | ||||
|                     setSelections.selection, | ||||
|                   ], | ||||
|                   otherSelections: selectionRanges.otherSelections, | ||||
| @ -312,7 +328,7 @@ export const ModelingMachineProvider = ({ | ||||
|                 codeMirrorSelection, | ||||
|                 updateSceneObjectColors, | ||||
|               } = handleSelectionBatch({ | ||||
|                 selections, | ||||
|                 selections: convertSelectionsToOld(selections), | ||||
|               }) | ||||
|               codeMirrorSelection && dispatchSelection(codeMirrorSelection) | ||||
|               engineEvents && | ||||
| @ -336,18 +352,18 @@ export const ModelingMachineProvider = ({ | ||||
|             if (setSelections.selectionType === 'otherSelection') { | ||||
|               if (editorManager.isShiftDown) { | ||||
|                 selections = { | ||||
|                   codeBasedSelections: selectionRanges.codeBasedSelections, | ||||
|                   graphSelections: selectionRanges.graphSelections, | ||||
|                   otherSelections: [setSelections.selection], | ||||
|                 } | ||||
|               } else { | ||||
|                 selections = { | ||||
|                   codeBasedSelections: [], | ||||
|                   graphSelections: [], | ||||
|                   otherSelections: [setSelections.selection], | ||||
|                 } | ||||
|               } | ||||
|               const { engineEvents, updateSceneObjectColors } = | ||||
|                 handleSelectionBatch({ | ||||
|                   selections, | ||||
|                   selections: convertSelectionsToOld(selections), | ||||
|                 }) | ||||
|               engineEvents && | ||||
|                 engineEvents.forEach((event) => { | ||||
| @ -360,7 +376,9 @@ export const ModelingMachineProvider = ({ | ||||
|               } | ||||
|             } | ||||
|             if (setSelections.selectionType === 'completeSelection') { | ||||
|               editorManager.selectRange(setSelections.selection) | ||||
|               editorManager.selectRange( | ||||
|                 convertSelectionsToOld(setSelections.selection) | ||||
|               ) | ||||
|               if (!sketchDetails) | ||||
|                 return { | ||||
|                   selectionRanges: setSelections.selection, | ||||
| @ -494,10 +512,11 @@ export const ModelingMachineProvider = ({ | ||||
|         'has valid sweep selection': ({ context: { selectionRanges } }) => { | ||||
|           // A user can begin extruding if they either have 1+ faces selected or nothing selected | ||||
|           // TODO: I believe this guard only allows for extruding a single face at a time | ||||
|           const _selections = convertSelectionsToOld(selectionRanges) | ||||
|           const hasNoSelection = | ||||
|             selectionRanges.codeBasedSelections.length === 0 || | ||||
|             isRangeBetweenCharacters(selectionRanges) || | ||||
|             isSelectionLastLine(selectionRanges, codeManager.code) | ||||
|             _selections.codeBasedSelections.length === 0 || | ||||
|             isRangeBetweenCharacters(_selections) || | ||||
|             isSelectionLastLine(_selections, codeManager.code) | ||||
|  | ||||
|           if (hasNoSelection) { | ||||
|             // they have no selection, we should enable the button | ||||
| @ -505,31 +524,34 @@ export const ModelingMachineProvider = ({ | ||||
|             // BUT only if there's extrudable geometry | ||||
|             return doesSceneHaveSweepableSketch(kclManager.ast) | ||||
|           } | ||||
|           if (!isSketchPipe(selectionRanges)) return false | ||||
|           if (!isSketchPipe(_selections)) return false | ||||
|  | ||||
|           return canSweepSelection(selectionRanges) | ||||
|           return canSweepSelection(_selections) | ||||
|         }, | ||||
|         'has valid selection for deletion': ({ | ||||
|           context: { selectionRanges }, | ||||
|         }) => { | ||||
|           const _selections = convertSelectionsToOld(selectionRanges) | ||||
|           if (!commandBarState.matches('Closed')) return false | ||||
|           if (selectionRanges.codeBasedSelections.length <= 0) return false | ||||
|           if (_selections.codeBasedSelections.length <= 0) return false | ||||
|           return true | ||||
|         }, | ||||
|         'has valid fillet selection': ({ context: { selectionRanges } }) => | ||||
|           hasValidFilletSelection({ | ||||
|             selectionRanges, | ||||
|         'has valid fillet selection': ({ context: { selectionRanges } }) => { | ||||
|           const _selections = convertSelectionsToOld(selectionRanges) | ||||
|           return hasValidFilletSelection({ | ||||
|             selectionRanges: _selections, | ||||
|             ast: kclManager.ast, | ||||
|             code: codeManager.code, | ||||
|           }), | ||||
|           }) | ||||
|         }, | ||||
|         'Selection is on face': ({ context: { selectionRanges }, event }) => { | ||||
|           if (event.type !== 'Enter sketch') return false | ||||
|           if (event.data?.forceNewSketch) return false | ||||
|           if (!isSingleCursorInPipe(selectionRanges, kclManager.ast)) | ||||
|             return false | ||||
|           const _selections = convertSelectionsToOld(selectionRanges) | ||||
|           if (!isSingleCursorInPipe(_selections, kclManager.ast)) return false | ||||
|           return !!isCursorInSketchCommandRange( | ||||
|             engineCommandManager.artifactGraph, | ||||
|             selectionRanges | ||||
|             _selections | ||||
|           ) | ||||
|         }, | ||||
|         'Has exportable geometry': () => { | ||||
| @ -619,7 +641,8 @@ export const ModelingMachineProvider = ({ | ||||
|         }), | ||||
|         'animate-to-sketch': fromPromise( | ||||
|           async ({ input: { selectionRanges } }) => { | ||||
|             const sourceRange = selectionRanges.codeBasedSelections[0].range | ||||
|             const _selections = convertSelectionsToOld(selectionRanges) | ||||
|             const sourceRange = _selections.codeBasedSelections[0].range | ||||
|             const sketchPathToNode = getNodePathFromSourceRange( | ||||
|               kclManager.ast, | ||||
|               sourceRange | ||||
| @ -643,10 +666,11 @@ export const ModelingMachineProvider = ({ | ||||
|         ), | ||||
|         'Get horizontal info': fromPromise( | ||||
|           async ({ input: { selectionRanges, sketchDetails } }) => { | ||||
|             const _selections = convertSelectionsToOld(selectionRanges) | ||||
|             const { modifiedAst, pathToNodeMap } = | ||||
|               await applyConstraintHorzVertDistance({ | ||||
|                 constraint: 'setHorzDistance', | ||||
|                 selectionRanges, | ||||
|                 selectionRanges: _selections, | ||||
|               }) | ||||
|             const _modifiedAst = parse(recast(modifiedAst)) | ||||
|             if (!sketchDetails) | ||||
| @ -664,7 +688,8 @@ export const ModelingMachineProvider = ({ | ||||
|                 sketchDetails.origin | ||||
|               ) | ||||
|             if (err(updatedAst)) return Promise.reject(updatedAst) | ||||
|             const selection = updateSelections( | ||||
|             // const selection = updateSelections( | ||||
|             const selection = updateSelections2( | ||||
|               pathToNodeMap, | ||||
|               selectionRanges, | ||||
|               updatedAst.newAst | ||||
| @ -682,7 +707,7 @@ export const ModelingMachineProvider = ({ | ||||
|             const { modifiedAst, pathToNodeMap } = | ||||
|               await applyConstraintHorzVertDistance({ | ||||
|                 constraint: 'setVertDistance', | ||||
|                 selectionRanges, | ||||
|                 selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|               }) | ||||
|             const _modifiedAst = parse(recast(modifiedAst)) | ||||
|             if (!sketchDetails) | ||||
| @ -702,7 +727,7 @@ export const ModelingMachineProvider = ({ | ||||
|             if (err(updatedAst)) return Promise.reject(updatedAst) | ||||
|             const selection = updateSelections( | ||||
|               pathToNodeMap, | ||||
|               selectionRanges, | ||||
|               convertSelectionsToOld(selectionRanges), | ||||
|               updatedAst.newAst | ||||
|             ) | ||||
|             if (err(selection)) return Promise.reject(selection) | ||||
| @ -716,15 +741,15 @@ export const ModelingMachineProvider = ({ | ||||
|         'Get angle info': fromPromise( | ||||
|           async ({ input: { selectionRanges, sketchDetails } }) => { | ||||
|             const info = angleBetweenInfo({ | ||||
|               selectionRanges, | ||||
|               selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|             }) | ||||
|             if (err(info)) return Promise.reject(info) | ||||
|             const { modifiedAst, pathToNodeMap } = await (info.enabled | ||||
|               ? applyConstraintAngleBetween({ | ||||
|                   selectionRanges, | ||||
|                   selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|                 }) | ||||
|               : applyConstraintAngleLength({ | ||||
|                   selectionRanges, | ||||
|                   selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|                   angleOrLength: 'setAngle', | ||||
|                 })) | ||||
|             const _modifiedAst = parse(recast(modifiedAst)) | ||||
| @ -747,7 +772,7 @@ export const ModelingMachineProvider = ({ | ||||
|             if (err(updatedAst)) return Promise.reject(updatedAst) | ||||
|             const selection = updateSelections( | ||||
|               pathToNodeMap, | ||||
|               selectionRanges, | ||||
|               convertSelectionsToOld(selectionRanges), | ||||
|               updatedAst.newAst | ||||
|             ) | ||||
|             if (err(selection)) return Promise.reject(selection) | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { toolTips } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { Program, Expr, VariableDeclarator } from '../../lang/wasm' | ||||
| import { | ||||
|   getNodePathFromSourceRange, | ||||
| @ -18,7 +18,7 @@ import { TransformInfo } from 'lang/std/stdTypes' | ||||
| export function equalAngleInfo({ | ||||
|   selectionRanges, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
| }): | ||||
|   | { | ||||
|       transforms: TransformInfo[] | ||||
| @ -82,7 +82,7 @@ export function equalAngleInfo({ | ||||
| export function applyConstraintEqualAngle({ | ||||
|   selectionRanges, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
| }): | ||||
|   | { | ||||
|       modifiedAst: Program | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { toolTips } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { Program, Expr, VariableDeclarator } from '../../lang/wasm' | ||||
| import { | ||||
|   getNodePathFromSourceRange, | ||||
| @ -18,7 +18,7 @@ import { err } from 'lib/trap' | ||||
| export function setEqualLengthInfo({ | ||||
|   selectionRanges, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
| }): | ||||
|   | { | ||||
|       transforms: TransformInfo[] | ||||
| @ -83,7 +83,7 @@ export function setEqualLengthInfo({ | ||||
| export function applyConstraintEqualLength({ | ||||
|   selectionRanges, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
| }): | ||||
|   | { | ||||
|       modifiedAst: Program | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { toolTips } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { Program, ProgramMemory, Expr } from '../../lang/wasm' | ||||
| import { | ||||
|   getNodePathFromSourceRange, | ||||
| @ -15,7 +15,7 @@ import { kclManager } from 'lib/singletons' | ||||
| import { err } from 'lib/trap' | ||||
|  | ||||
| export function horzVertInfo( | ||||
|   selectionRanges: Selections, | ||||
|   selectionRanges: Selections__old, | ||||
|   horOrVert: 'vertical' | 'horizontal' | ||||
| ): | ||||
|   | { | ||||
| @ -53,7 +53,7 @@ export function horzVertInfo( | ||||
| } | ||||
|  | ||||
| export function applyConstraintHorzVert( | ||||
|   selectionRanges: Selections, | ||||
|   selectionRanges: Selections__old, | ||||
|   horOrVert: 'vertical' | 'horizontal', | ||||
|   ast: Program, | ||||
|   programMemory: ProgramMemory | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| import { toolTips } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Program, Expr, VariableDeclarator } from '../../lang/wasm' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { | ||||
|   getNodePathFromSourceRange, | ||||
|   getNodeFromPath, | ||||
| @ -25,12 +25,12 @@ const getModalInfo = createInfoModal(GetInfoModal) | ||||
| export function intersectInfo({ | ||||
|   selectionRanges, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
| }): | ||||
|   | { | ||||
|       transforms: TransformInfo[] | ||||
|       enabled: boolean | ||||
|       forcedSelectionRanges: Selections | ||||
|       forcedSelectionRanges: Selections__old | ||||
|     } | ||||
|   | Error { | ||||
|   if (selectionRanges.codeBasedSelections.length < 2) { | ||||
| @ -134,7 +134,7 @@ export function intersectInfo({ | ||||
| export async function applyConstraintIntersect({ | ||||
|   selectionRanges, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
| }): Promise<{ | ||||
|   modifiedAst: Program | ||||
|   pathToNodeMap: PathToNodeMap | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { toolTips } from 'lang/langHelpers' | ||||
| import { Selection, Selections } from 'lib/selections' | ||||
| import { Selection__old, Selections__old } from 'lib/selections' | ||||
| import { PathToNode, Program, Expr } from '../../lang/wasm' | ||||
| import { | ||||
|   getNodePathFromSourceRange, | ||||
| @ -18,13 +18,13 @@ export function removeConstrainingValuesInfo({ | ||||
|   selectionRanges, | ||||
|   pathToNodes, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   pathToNodes?: Array<PathToNode> | ||||
| }): | ||||
|   | { | ||||
|       transforms: TransformInfo[] | ||||
|       enabled: boolean | ||||
|       updatedSelectionRanges: Selections | ||||
|       updatedSelectionRanges: Selections__old | ||||
|     } | ||||
|   | Error { | ||||
|   const paths = | ||||
| @ -45,7 +45,7 @@ export function removeConstrainingValuesInfo({ | ||||
|     ? { | ||||
|         otherSelections: [], | ||||
|         codeBasedSelections: nodes.map( | ||||
|           (node): Selection => ({ | ||||
|           (node): Selection__old => ({ | ||||
|             range: [node.start, node.end], | ||||
|             type: 'default', | ||||
|           }) | ||||
| @ -73,7 +73,7 @@ export function applyRemoveConstrainingValues({ | ||||
|   selectionRanges, | ||||
|   pathToNodes, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   pathToNodes?: Array<PathToNode> | ||||
| }): | ||||
|   | { | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| import { toolTips } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Program, Expr } from '../../lang/wasm' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { | ||||
|   getNodePathFromSourceRange, | ||||
|   getNodeFromPath, | ||||
| @ -32,7 +32,7 @@ export function absDistanceInfo({ | ||||
|   selectionRanges, | ||||
|   constraint, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   constraint: Constraint | ||||
| }): | ||||
|   | { | ||||
| @ -93,7 +93,7 @@ export async function applyConstraintAbsDistance({ | ||||
|   selectionRanges, | ||||
|   constraint, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   constraint: 'xAbs' | 'yAbs' | ||||
| }): Promise<{ | ||||
|   modifiedAst: Program | ||||
| @ -157,7 +157,7 @@ export function applyConstraintAxisAlign({ | ||||
|   selectionRanges, | ||||
|   constraint, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   constraint: 'snapToYAxis' | 'snapToXAxis' | ||||
| }): | ||||
|   | { | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| import { toolTips } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Program, Expr, VariableDeclarator } from '../../lang/wasm' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { | ||||
|   getNodePathFromSourceRange, | ||||
|   getNodeFromPath, | ||||
| @ -24,7 +24,7 @@ const getModalInfo = createInfoModal(GetInfoModal) | ||||
| export function angleBetweenInfo({ | ||||
|   selectionRanges, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
| }): | ||||
|   | { | ||||
|       transforms: TransformInfo[] | ||||
| @ -90,7 +90,7 @@ export async function applyConstraintAngleBetween({ | ||||
|   selectionRanges, | ||||
| }: // constraint, | ||||
| { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   // constraint: 'setHorzDistance' | 'setVertDistance' | ||||
| }): Promise<{ | ||||
|   modifiedAst: Program | ||||
|  | ||||
| @ -16,7 +16,7 @@ import { GetInfoModal, createInfoModal } from '../SetHorVertDistanceModal' | ||||
| import { createLiteral, createVariableDeclaration } from '../../lang/modifyAst' | ||||
| import { removeDoubleNegatives } from '../AvailableVarsHelpers' | ||||
| import { kclManager } from 'lib/singletons' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { cleanErrs, err } from 'lib/trap' | ||||
|  | ||||
| const getModalInfo = createInfoModal(GetInfoModal) | ||||
| @ -25,7 +25,7 @@ export function horzVertDistanceInfo({ | ||||
|   selectionRanges, | ||||
|   constraint, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   constraint: 'setHorzDistance' | 'setVertDistance' | ||||
| }): | ||||
|   | { | ||||
| @ -95,7 +95,7 @@ export async function applyConstraintHorzVertDistance({ | ||||
|   // TODO align will always be false (covered by synconous applyConstraintHorzVertAlign), remove it | ||||
|   isAlign = false, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   constraint: 'setHorzDistance' | 'setVertDistance' | ||||
|   isAlign?: false | ||||
| }): Promise<{ | ||||
| @ -181,7 +181,7 @@ export function applyConstraintHorzVertAlign({ | ||||
|   selectionRanges, | ||||
|   constraint, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   constraint: 'setHorzDistance' | 'setVertDistance' | ||||
| }): | ||||
|   | { | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| import { toolTips } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Program, Expr } from '../../lang/wasm' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { | ||||
|   getNodePathFromSourceRange, | ||||
|   getNodeFromPath, | ||||
| @ -32,7 +32,7 @@ export function angleLengthInfo({ | ||||
|   selectionRanges, | ||||
|   angleOrLength = 'setLength', | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   angleOrLength?: 'setLength' | 'setAngle' | ||||
| }): | ||||
|   | { | ||||
| @ -74,7 +74,7 @@ export async function applyConstraintAngleLength({ | ||||
|   selectionRanges, | ||||
|   angleOrLength = 'setLength', | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   angleOrLength?: 'setLength' | 'setAngle' | ||||
| }): Promise<{ | ||||
|   modifiedAst: Program | ||||
|  | ||||
| @ -2,7 +2,11 @@ import { EditorView, ViewUpdate } from '@codemirror/view' | ||||
| import { EditorSelection, Annotation, Transaction } from '@codemirror/state' | ||||
| import { engineCommandManager } from 'lib/singletons' | ||||
| import { modelingMachine, ModelingMachineEvent } from 'machines/modelingMachine' | ||||
| import { Selections, processCodeMirrorRanges, Selection } from 'lib/selections' | ||||
| import { | ||||
|   Selections__old, | ||||
|   Selection__old, | ||||
|   processCodeMirrorRanges, | ||||
| } from 'lib/selections' | ||||
| import { undo, redo } from '@codemirror/commands' | ||||
| import { CommandBarMachineEvent } from 'machines/commandBarMachine' | ||||
| import { addLineHighlight, addLineHighlightEvent } from './highlightextension' | ||||
| @ -31,7 +35,7 @@ export default class EditorManager { | ||||
|   private _copilotEnabled: boolean = true | ||||
|  | ||||
|   private _isShiftDown: boolean = false | ||||
|   private _selectionRanges: Selections = { | ||||
|   private _selectionRanges: Selections__old = { | ||||
|     otherSelections: [], | ||||
|     codeBasedSelections: [], | ||||
|   } | ||||
| @ -73,7 +77,7 @@ export default class EditorManager { | ||||
|     this._isShiftDown = isShiftDown | ||||
|   } | ||||
|  | ||||
|   set selectionRanges(selectionRanges: Selections) { | ||||
|   set selectionRanges(selectionRanges: Selections__old) { | ||||
|     this._selectionRanges = selectionRanges | ||||
|   } | ||||
|  | ||||
| @ -97,7 +101,7 @@ export default class EditorManager { | ||||
|     return this._highlightRange | ||||
|   } | ||||
|  | ||||
|   setHighlightRange(selections: Array<Selection['range']>): void { | ||||
|   setHighlightRange(selections: Array<Selection__old['range']>): void { | ||||
|     this._highlightRange = selections | ||||
|  | ||||
|     const selectionsWithSafeEnds = selections.map((s): [number, number] => { | ||||
| @ -203,7 +207,7 @@ export default class EditorManager { | ||||
|     return false | ||||
|   } | ||||
|  | ||||
|   selectRange(selections: Selections) { | ||||
|   selectRange(selections: Selections__old) { | ||||
|     if (selections.codeBasedSelections.length === 0) { | ||||
|       return | ||||
|     } | ||||
|  | ||||
| @ -9,10 +9,9 @@ import { useModelingContext } from './useModelingContext' | ||||
| import { getEventForSelectWithPoint } from 'lib/selections' | ||||
| import { | ||||
|   getCapCodeRef, | ||||
|   getSweepEdgeCodeRef, | ||||
|   getSweepFromSuspectedSweepSurface, | ||||
|   getSolid2dCodeRef, | ||||
|   getWallCodeRef, | ||||
|   getCodeRefsByArtifactId, | ||||
| } from 'lang/std/artifactGraph' | ||||
| import { err, reportRejection } from 'lib/trap' | ||||
| import { DefaultPlaneStr, getFaceDetails } from 'clientSideScene/sceneEntities' | ||||
| @ -29,52 +28,14 @@ export function useEngineConnectionSubscriptions() { | ||||
|       event: 'highlight_set_entity', | ||||
|       callback: ({ data }) => { | ||||
|         if (data?.entity_id) { | ||||
|           const artifact = engineCommandManager.artifactGraph.get( | ||||
|             data.entity_id | ||||
|           const codeRefs = getCodeRefsByArtifactId( | ||||
|             data.entity_id, | ||||
|             engineCommandManager.artifactGraph | ||||
|           ) | ||||
|           if (artifact?.type === 'solid2D') { | ||||
|             const codeRef = getSolid2dCodeRef( | ||||
|               artifact, | ||||
|               engineCommandManager.artifactGraph | ||||
|             ) | ||||
|             if (err(codeRef)) return | ||||
|             editorManager.setHighlightRange([codeRef.range]) | ||||
|           } else if (artifact?.type === 'cap') { | ||||
|             const codeRef = getCapCodeRef( | ||||
|               artifact, | ||||
|               engineCommandManager.artifactGraph | ||||
|             ) | ||||
|             if (err(codeRef)) return | ||||
|             editorManager.setHighlightRange([codeRef.range]) | ||||
|           } else if (artifact?.type === 'wall') { | ||||
|             const extrusion = getSweepFromSuspectedSweepSurface( | ||||
|               data.entity_id, | ||||
|               engineCommandManager.artifactGraph | ||||
|             ) | ||||
|             const codeRef = getWallCodeRef( | ||||
|               artifact, | ||||
|               engineCommandManager.artifactGraph | ||||
|             ) | ||||
|             if (err(codeRef)) return | ||||
|             editorManager.setHighlightRange( | ||||
|               err(extrusion) | ||||
|                 ? [codeRef.range] | ||||
|                 : [codeRef.range, extrusion.codeRef.range] | ||||
|             ) | ||||
|           } else if (artifact?.type === 'sweepEdge') { | ||||
|             const codeRef = getSweepEdgeCodeRef( | ||||
|               artifact, | ||||
|               engineCommandManager.artifactGraph | ||||
|             ) | ||||
|             if (err(codeRef)) return | ||||
|             editorManager.setHighlightRange([codeRef.range]) | ||||
|           } else if (artifact?.type === 'segment') { | ||||
|             editorManager.setHighlightRange([ | ||||
|               artifact?.codeRef?.range || [0, 0], | ||||
|             ]) | ||||
|           } else { | ||||
|             editorManager.setHighlightRange([[0, 0]]) | ||||
|           if (codeRefs) { | ||||
|             editorManager.setHighlightRange(codeRefs.map(({ range }) => range)) | ||||
|           } | ||||
|           editorManager.setHighlightRange([[0, 0]]) | ||||
|         } else if ( | ||||
|           !editorManager.highlightRange || | ||||
|           (editorManager.highlightRange[0][0] !== 0 && | ||||
|  | ||||
| @ -11,6 +11,7 @@ import { useModelingContext } from './useModelingContext' | ||||
| import { PathToNode, SourceRange } from 'lang/wasm' | ||||
| import { useKclContext } from 'lang/KclProvider' | ||||
| import { toSync } from 'lib/utils' | ||||
| import { convertSelectionsToOld } from 'lib/selections' | ||||
|  | ||||
| export const getVarNameModal = createSetVarNameModal(SetVarNameModal) | ||||
|  | ||||
| @ -28,14 +29,19 @@ export function useConvertToVariable(range?: SourceRange) { | ||||
|  | ||||
|     const meta = isNodeSafeToReplace( | ||||
|       parsed, | ||||
|       range || context.selectionRanges.codeBasedSelections?.[0]?.range || [] | ||||
|       range || | ||||
|         convertSelectionsToOld(context.selectionRanges).codeBasedSelections?.[0] | ||||
|           ?.range || | ||||
|         [] | ||||
|     ) | ||||
|     if (trap(meta)) return | ||||
|  | ||||
|     const { isSafe, value } = meta | ||||
|     const canReplace = isSafe && value.type !== 'Identifier' | ||||
|     const isOnlyOneSelection = | ||||
|       !!range || context.selectionRanges.codeBasedSelections.length === 1 | ||||
|       !!range || | ||||
|       convertSelectionsToOld(context.selectionRanges).codeBasedSelections | ||||
|         .length === 1 | ||||
|  | ||||
|     setEnabled(canReplace && isOnlyOneSelection) | ||||
|   }, [context.selectionRanges]) | ||||
| @ -52,7 +58,9 @@ export function useConvertToVariable(range?: SourceRange) { | ||||
|         moveValueIntoNewVariable( | ||||
|           ast, | ||||
|           kclManager.programMemory, | ||||
|           range || context.selectionRanges.codeBasedSelections[0].range, | ||||
|           range || | ||||
|             convertSelectionsToOld(context.selectionRanges) | ||||
|               .codeBasedSelections[0].range, | ||||
|           variableName | ||||
|         ) | ||||
|  | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { executeAst, lintAst } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { KCLError, kclErrorsToDiagnostics } from './errors' | ||||
| import { uuidv4 } from 'lib/utils' | ||||
| import { EngineCommandManager } from './std/engineConnection' | ||||
| @ -425,14 +425,14 @@ export class KclManager { | ||||
|     } | ||||
|   ): Promise<{ | ||||
|     newAst: Program | ||||
|     selections?: Selections | ||||
|     selections?: Selections__old | ||||
|   }> { | ||||
|     const newCode = recast(ast) | ||||
|     if (err(newCode)) return Promise.reject(newCode) | ||||
|  | ||||
|     const astWithUpdatedSource = this.safeParse(newCode) | ||||
|     if (!astWithUpdatedSource) return Promise.reject(new Error('bad ast')) | ||||
|     let returnVal: Selections | undefined = undefined | ||||
|     let returnVal: Selections__old | undefined = undefined | ||||
|  | ||||
|     if (optionalParams?.focusPath) { | ||||
|       returnVal = { | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { Selection } from 'lib/selections' | ||||
| import { err, reportRejection, trap } from 'lib/trap' | ||||
| import { Selection__old } from 'lib/selections' | ||||
| import { | ||||
|   Program, | ||||
|   CallExpression, | ||||
| @ -762,7 +762,7 @@ export function createBinaryExpressionWithUnary([left, right]: [ | ||||
|  | ||||
| export function giveSketchFnCallTag( | ||||
|   ast: Program, | ||||
|   range: Selection['range'], | ||||
|   range: Selection__old['range'], | ||||
|   tag?: string | ||||
| ): | ||||
|   | { | ||||
| @ -836,7 +836,7 @@ export function moveValueIntoNewVariablePath( | ||||
| export function moveValueIntoNewVariable( | ||||
|   ast: Program, | ||||
|   programMemory: ProgramMemory, | ||||
|   sourceRange: Selection['range'], | ||||
|   sourceRange: Selection__old['range'], | ||||
|   variableName: string | ||||
| ): { | ||||
|   modifiedAst: Program | ||||
| @ -955,7 +955,7 @@ export function removeSingleConstraintInfo( | ||||
|  | ||||
| export async function deleteFromSelection( | ||||
|   ast: Program, | ||||
|   selection: Selection, | ||||
|   selection: Selection__old, | ||||
|   programMemory: ProgramMemory, | ||||
|   getFaceDetails: (id: string) => Promise<Models['FaceIsPlanar_type']> = () => | ||||
|     ({} as any) | ||||
|  | ||||
| @ -19,7 +19,7 @@ import { | ||||
| import { getNodeFromPath, getNodePathFromSourceRange } from '../queryAst' | ||||
| import { createLiteral } from 'lang/modifyAst' | ||||
| import { err } from 'lib/trap' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { engineCommandManager, kclManager } from 'lib/singletons' | ||||
| import { VITE_KC_DEV_TOKEN } from 'env' | ||||
| import { KclCommandValue } from 'lib/commandTypes' | ||||
| @ -106,7 +106,7 @@ const runGetPathToExtrudeForSegmentSelectionTest = async ( | ||||
|     code.indexOf(selectedSegmentSnippet), | ||||
|     code.indexOf(selectedSegmentSnippet) + selectedSegmentSnippet.length, | ||||
|   ] | ||||
|   const selection: Selections = { | ||||
|   const selection: Selections__old = { | ||||
|     codeBasedSelections: [ | ||||
|       { | ||||
|         range: segmentRange, | ||||
| @ -469,7 +469,7 @@ const runModifyAstWithFilletAndTagTest = async ( | ||||
|       code.indexOf(selectionSnippet) + selectionSnippet.length, | ||||
|     ] | ||||
|   ) | ||||
|   const selection: Selections = { | ||||
|   const selection: Selections__old = { | ||||
|     codeBasedSelections: segmentRanges.map((segmentRange) => ({ | ||||
|       range: segmentRange, | ||||
|       type: 'default', | ||||
| @ -730,7 +730,7 @@ describe('Testing button states', () => { | ||||
|         ] | ||||
|       : [ast.end, ast.end] // empty line in the end of the code | ||||
|  | ||||
|     const selectionRanges: Selections = { | ||||
|     const selectionRanges: Selections__old = { | ||||
|       codeBasedSelections: [ | ||||
|         { | ||||
|           range, | ||||
|  | ||||
| @ -31,7 +31,7 @@ import { | ||||
|   sketchLineHelperMap, | ||||
| } from '../std/sketch' | ||||
| import { err, trap } from 'lib/trap' | ||||
| import { Selections, canFilletSelection } from 'lib/selections' | ||||
| import { Selections__old, canFilletSelection } from 'lib/selections' | ||||
| import { KclCommandValue } from 'lib/commandTypes' | ||||
| import { | ||||
|   ArtifactGraph, | ||||
| @ -45,7 +45,7 @@ import { kclManager, engineCommandManager, editorManager } from 'lib/singletons' | ||||
|  | ||||
| export function applyFilletToSelection( | ||||
|   ast: Program, | ||||
|   selection: Selections, | ||||
|   selection: Selections__old, | ||||
|   radius: KclCommandValue | ||||
| ): void | Error { | ||||
|   // 1. clone ast | ||||
| @ -63,7 +63,7 @@ export function applyFilletToSelection( | ||||
|  | ||||
| export function modifyAstWithFilletAndTag( | ||||
|   ast: Program, | ||||
|   selection: Selections, | ||||
|   selection: Selections__old, | ||||
|   radius: KclCommandValue | ||||
| ): { modifiedAst: Program; pathToFilletNode: Array<PathToNode> } | Error { | ||||
|   const astResult = insertRadiusIntoAst(ast, radius) | ||||
| @ -130,7 +130,7 @@ function insertRadiusIntoAst( | ||||
|  | ||||
| export function getPathToExtrudeForSegmentSelection( | ||||
|   ast: Program, | ||||
|   selection: Selections, | ||||
|   selection: Selections__old, | ||||
|   programMemory: ProgramMemory, | ||||
|   artifactGraph: ArtifactGraph | ||||
| ): { pathToSegmentNode: PathToNode; pathToExtrudeNode: PathToNode } | Error { | ||||
| @ -447,7 +447,7 @@ export const hasValidFilletSelection = ({ | ||||
|   ast, | ||||
|   code, | ||||
| }: { | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   ast: Program | ||||
|   code: string | ||||
| }) => { | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| import { ToolTip } from 'lang/langHelpers' | ||||
| import { Selection, Selections } from 'lib/selections' | ||||
| import { Selection__old, Selections__old } from 'lib/selections' | ||||
| import { | ||||
|   ArrayExpression, | ||||
|   BinaryExpression, | ||||
| @ -120,7 +120,7 @@ export function getNodeFromPathCurry( | ||||
|  | ||||
| function moreNodePathFromSourceRange( | ||||
|   node: Expr | ExpressionStatement | VariableDeclaration | ReturnStatement, | ||||
|   sourceRange: Selection['range'], | ||||
|   sourceRange: Selection__old['range'], | ||||
|   previousPath: PathToNode = [['body', '']] | ||||
| ): PathToNode { | ||||
|   const [start, end] = sourceRange | ||||
| @ -315,7 +315,7 @@ function moreNodePathFromSourceRange( | ||||
|  | ||||
| export function getNodePathFromSourceRange( | ||||
|   node: Program, | ||||
|   sourceRange: Selection['range'], | ||||
|   sourceRange: Selection__old['range'], | ||||
|   previousPath: PathToNode = [['body', '']] | ||||
| ): PathToNode { | ||||
|   const [start, end] = sourceRange || [] | ||||
| @ -493,7 +493,7 @@ export function findAllPreviousVariablesPath( | ||||
| export function findAllPreviousVariables( | ||||
|   ast: Program, | ||||
|   programMemory: ProgramMemory, | ||||
|   sourceRange: Selection['range'], | ||||
|   sourceRange: Selection__old['range'], | ||||
|   type: 'number' | 'string' = 'number' | ||||
| ): { | ||||
|   variables: PrevVariable<typeof type extends 'number' ? number : string>[] | ||||
| @ -639,8 +639,8 @@ export function isValueZero(val?: Expr): boolean { | ||||
| export function isLinesParallelAndConstrained( | ||||
|   ast: Program, | ||||
|   programMemory: ProgramMemory, | ||||
|   primaryLine: Selection, | ||||
|   secondaryLine: Selection | ||||
|   primaryLine: Selection__old, | ||||
|   secondaryLine: Selection__old | ||||
| ): | ||||
|   | { | ||||
|       isParallelAndConstrained: boolean | ||||
| @ -735,7 +735,7 @@ export function doesPipeHaveCallExp({ | ||||
| }: { | ||||
|   calleeName: string | ||||
|   ast: Program | ||||
|   selection: Selection | ||||
|   selection: Selection__old | ||||
| }): boolean { | ||||
|   const pathToNode = getNodePathFromSourceRange(ast, selection.range) | ||||
|   const pipeExpressionMeta = getNodeFromPath<PipeExpression>( | ||||
| @ -762,7 +762,7 @@ export function hasExtrudeSketchGroup({ | ||||
|   programMemory, | ||||
| }: { | ||||
|   ast: Program | ||||
|   selection: Selection | ||||
|   selection: Selection__old | ||||
|   programMemory: ProgramMemory | ||||
| }): boolean { | ||||
|   const pathToNode = getNodePathFromSourceRange(ast, selection.range) | ||||
| @ -786,7 +786,7 @@ export function hasExtrudeSketchGroup({ | ||||
| } | ||||
|  | ||||
| export function isSingleCursorInPipe( | ||||
|   selectionRanges: Selections, | ||||
|   selectionRanges: Selections__old, | ||||
|   ast: Program | ||||
| ) { | ||||
|   if (selectionRanges.codeBasedSelections.length !== 1) return false | ||||
| @ -860,7 +860,10 @@ export function findUsesOfTagInPipe( | ||||
|   return dependentRanges | ||||
| } | ||||
|  | ||||
| export function hasSketchPipeBeenExtruded(selection: Selection, ast: Program) { | ||||
| export function hasSketchPipeBeenExtruded( | ||||
|   selection: Selection__old, | ||||
|   ast: Program | ||||
| ) { | ||||
|   const path = getNodePathFromSourceRange(ast, selection.range) | ||||
|   const _node = getNodeFromPath<PipeExpression>(ast, path, 'PipeExpression') | ||||
|   if (err(_node)) return false | ||||
|  | ||||
| @ -5,86 +5,90 @@ import { err } from 'lib/trap' | ||||
|  | ||||
| export type ArtifactId = string | ||||
|  | ||||
| interface CommonCommandProperties { | ||||
| interface BaseArtifact { | ||||
|   id: ArtifactId | ||||
| } | ||||
|  | ||||
| export interface CodeRef { | ||||
|   range: SourceRange | ||||
|   pathToNode: PathToNode | ||||
| } | ||||
|  | ||||
| export interface PlaneArtifact { | ||||
| export interface PlaneArtifact extends BaseArtifact { | ||||
|   type: 'plane' | ||||
|   pathIds: Array<ArtifactId> | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
| export interface PlaneArtifactRich { | ||||
| export interface PlaneArtifactRich extends BaseArtifact { | ||||
|   type: 'plane' | ||||
|   paths: Array<PathArtifact> | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
|  | ||||
| export interface PathArtifact { | ||||
| export interface PathArtifact extends BaseArtifact { | ||||
|   type: 'path' | ||||
|   planeId: ArtifactId | ||||
|   segIds: Array<ArtifactId> | ||||
|   sweepId: ArtifactId | ||||
|   solid2dId?: ArtifactId | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
|  | ||||
| interface solid2D { | ||||
| interface solid2D extends BaseArtifact { | ||||
|   type: 'solid2D' | ||||
|   pathId: ArtifactId | ||||
| } | ||||
| export interface PathArtifactRich { | ||||
| export interface PathArtifactRich extends BaseArtifact { | ||||
|   type: 'path' | ||||
|   plane: PlaneArtifact | WallArtifact | ||||
|   segments: Array<SegmentArtifact> | ||||
|   sweep: SweepArtifact | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
|  | ||||
| interface SegmentArtifact { | ||||
| interface SegmentArtifact extends BaseArtifact { | ||||
|   type: 'segment' | ||||
|   pathId: ArtifactId | ||||
|   surfaceId: ArtifactId | ||||
|   edgeIds: Array<ArtifactId> | ||||
|   edgeCutId?: ArtifactId | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
| interface SegmentArtifactRich { | ||||
| interface SegmentArtifactRich extends BaseArtifact { | ||||
|   type: 'segment' | ||||
|   path: PathArtifact | ||||
|   surf: WallArtifact | ||||
|   edges: Array<SweepEdge> | ||||
|   edgeCut?: EdgeCut | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
|  | ||||
| /** A Sweep is a more generic term for extrude, revolve, loft and sweep*/ | ||||
| interface SweepArtifact { | ||||
| interface SweepArtifact extends BaseArtifact { | ||||
|   type: 'sweep' | ||||
|   subType: 'extrusion' | 'revolve' | ||||
|   pathId: string | ||||
|   surfaceIds: Array<string> | ||||
|   edgeIds: Array<string> | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
| interface SweepArtifactRich { | ||||
| interface SweepArtifactRich extends BaseArtifact { | ||||
|   type: 'sweep' | ||||
|   subType: 'extrusion' | 'revolve' | ||||
|   path: PathArtifact | ||||
|   surfaces: Array<WallArtifact | CapArtifact> | ||||
|   edges: Array<SweepEdge> | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
|  | ||||
| interface WallArtifact { | ||||
| interface WallArtifact extends BaseArtifact { | ||||
|   type: 'wall' | ||||
|   segId: ArtifactId | ||||
|   edgeCutEdgeIds: Array<ArtifactId> | ||||
|   sweepId: ArtifactId | ||||
|   pathIds: Array<ArtifactId> | ||||
| } | ||||
| interface CapArtifact { | ||||
| interface CapArtifact extends BaseArtifact { | ||||
|   type: 'cap' | ||||
|   subType: 'start' | 'end' | ||||
|   edgeCutEdgeIds: Array<ArtifactId> | ||||
| @ -92,7 +96,7 @@ interface CapArtifact { | ||||
|   pathIds: Array<ArtifactId> | ||||
| } | ||||
|  | ||||
| interface SweepEdge { | ||||
| interface SweepEdge extends BaseArtifact { | ||||
|   type: 'sweepEdge' | ||||
|   segId: ArtifactId | ||||
|   sweepId: ArtifactId | ||||
| @ -100,16 +104,16 @@ interface SweepEdge { | ||||
| } | ||||
|  | ||||
| /** A edgeCut is a more generic term for both fillet or chamfer */ | ||||
| interface EdgeCut { | ||||
| interface EdgeCut extends BaseArtifact { | ||||
|   type: 'edgeCut' | ||||
|   subType: 'fillet' | 'chamfer' | ||||
|   consumedEdgeId: ArtifactId | ||||
|   edgeIds: Array<ArtifactId> | ||||
|   surfaceId: ArtifactId | ||||
|   codeRef: CommonCommandProperties | ||||
|   codeRef: CodeRef | ||||
| } | ||||
|  | ||||
| interface EdgeCutEdge { | ||||
| interface EdgeCutEdge extends BaseArtifact { | ||||
|   type: 'edgeCutEdge' | ||||
|   edgeCutId: ArtifactId | ||||
|   surfaceId: ArtifactId | ||||
| @ -258,6 +262,7 @@ export function getArtifactsToUpdate({ | ||||
|           id: currentPlaneId, | ||||
|           artifact: { | ||||
|             type: 'wall', | ||||
|             id, | ||||
|             segId: existingPlane.segId, | ||||
|             edgeCutEdgeIds: existingPlane.edgeCutEdgeIds, | ||||
|             sweepId: existingPlane.sweepId, | ||||
| @ -267,7 +272,10 @@ export function getArtifactsToUpdate({ | ||||
|       ] | ||||
|     } else { | ||||
|       return [ | ||||
|         { id: currentPlaneId, artifact: { type: 'plane', pathIds, codeRef } }, | ||||
|         { | ||||
|           id: currentPlaneId, | ||||
|           artifact: { type: 'plane', id: currentPlaneId, pathIds, codeRef }, | ||||
|         }, | ||||
|       ] | ||||
|     } | ||||
|   } else if (cmd.type === 'start_path') { | ||||
| @ -275,6 +283,7 @@ export function getArtifactsToUpdate({ | ||||
|       id, | ||||
|       artifact: { | ||||
|         type: 'path', | ||||
|         id, | ||||
|         segIds: [], | ||||
|         planeId: currentPlaneId, | ||||
|         sweepId: '', | ||||
| @ -287,7 +296,7 @@ export function getArtifactsToUpdate({ | ||||
|     if (plane?.type === 'plane') { | ||||
|       returnArr.push({ | ||||
|         id: currentPlaneId, | ||||
|         artifact: { type: 'plane', pathIds: [id], codeRef }, | ||||
|         artifact: { type: 'plane', id: currentPlaneId, pathIds: [id], codeRef }, | ||||
|       }) | ||||
|     } | ||||
|     if (plane?.type === 'wall') { | ||||
| @ -295,6 +304,7 @@ export function getArtifactsToUpdate({ | ||||
|         id: currentPlaneId, | ||||
|         artifact: { | ||||
|           type: 'wall', | ||||
|           id, | ||||
|           segId: plane.segId, | ||||
|           edgeCutEdgeIds: plane.edgeCutEdgeIds, | ||||
|           sweepId: plane.sweepId, | ||||
| @ -309,6 +319,7 @@ export function getArtifactsToUpdate({ | ||||
|       id, | ||||
|       artifact: { | ||||
|         type: 'segment', | ||||
|         id, | ||||
|         pathId, | ||||
|         surfaceId: '', | ||||
|         edgeIds: [], | ||||
| @ -327,7 +338,11 @@ export function getArtifactsToUpdate({ | ||||
|     ) { | ||||
|       returnArr.push({ | ||||
|         id: response.data.modeling_response.data.face_id, | ||||
|         artifact: { type: 'solid2D', pathId }, | ||||
|         artifact: { | ||||
|           type: 'solid2D', | ||||
|           id: response.data.modeling_response.data.face_id, | ||||
|           pathId, | ||||
|         }, | ||||
|       }) | ||||
|       const path = getArtifact(pathId) | ||||
|       if (path?.type === 'path') | ||||
| @ -347,6 +362,7 @@ export function getArtifactsToUpdate({ | ||||
|       artifact: { | ||||
|         type: 'sweep', | ||||
|         subType: subType, | ||||
|         id, | ||||
|         pathId: cmd.target, | ||||
|         surfaceIds: [], | ||||
|         edgeIds: [], | ||||
| @ -378,6 +394,7 @@ export function getArtifactsToUpdate({ | ||||
|               id: face_id, | ||||
|               artifact: { | ||||
|                 type: 'wall', | ||||
|                 id: face_id, | ||||
|                 segId: curve_id, | ||||
|                 edgeCutEdgeIds: [], | ||||
|                 sweepId: path.sweepId, | ||||
| @ -410,6 +427,7 @@ export function getArtifactsToUpdate({ | ||||
|             id: face_id, | ||||
|             artifact: { | ||||
|               type: 'cap', | ||||
|               id: face_id, | ||||
|               subType: cap === 'bottom' ? 'start' : 'end', | ||||
|               edgeCutEdgeIds: [], | ||||
|               sweepId: path.sweepId, | ||||
| @ -456,6 +474,7 @@ export function getArtifactsToUpdate({ | ||||
|         id: response.data.modeling_response.data.edge, | ||||
|         artifact: { | ||||
|           type: 'sweepEdge', | ||||
|           id: response.data.modeling_response.data.edge, | ||||
|           subType: | ||||
|             cmd.type === 'solid3d_get_prev_adjacent_edge' | ||||
|               ? 'adjacent' | ||||
| @ -484,6 +503,7 @@ export function getArtifactsToUpdate({ | ||||
|       id, | ||||
|       artifact: { | ||||
|         type: 'edgeCut', | ||||
|         id, | ||||
|         subType: cmd.cut_type, | ||||
|         consumedEdgeId: cmd.edge_id, | ||||
|         edgeIds: [], | ||||
| @ -574,6 +594,7 @@ export function expandPlane( | ||||
|   ) | ||||
|   return { | ||||
|     type: 'plane', | ||||
|     id: plane.id, | ||||
|     paths: Array.from(paths.values()), | ||||
|     codeRef: plane.codeRef, | ||||
|   } | ||||
| @ -602,6 +623,7 @@ export function expandPath( | ||||
|   if (err(plane)) return plane | ||||
|   return { | ||||
|     type: 'path', | ||||
|     id: path.id, | ||||
|     segments: Array.from(segs.values()), | ||||
|     sweep, | ||||
|     plane, | ||||
| @ -629,6 +651,7 @@ export function expandSweep( | ||||
|   return { | ||||
|     type: 'sweep', | ||||
|     subType: 'extrusion', | ||||
|     id: sweep.id, | ||||
|     surfaces: Array.from(surfs.values()), | ||||
|     edges: Array.from(edges.values()), | ||||
|     path, | ||||
| @ -664,6 +687,7 @@ export function expandSegment( | ||||
|  | ||||
|   return { | ||||
|     type: 'segment', | ||||
|     id: segment.id, | ||||
|     path, | ||||
|     surf, | ||||
|     edges: Array.from(edges.values()), | ||||
| @ -675,7 +699,7 @@ export function expandSegment( | ||||
| export function getCapCodeRef( | ||||
|   cap: CapArtifact, | ||||
|   artifactGraph: ArtifactGraph | ||||
| ): CommonCommandProperties | Error { | ||||
| ): CodeRef | Error { | ||||
|   const sweep = getArtifactOfTypes( | ||||
|     { key: cap.sweepId, types: ['sweep'] }, | ||||
|     artifactGraph | ||||
| @ -692,7 +716,7 @@ export function getCapCodeRef( | ||||
| export function getSolid2dCodeRef( | ||||
|   solid2D: solid2D, | ||||
|   artifactGraph: ArtifactGraph | ||||
| ): CommonCommandProperties | Error { | ||||
| ): CodeRef | Error { | ||||
|   const path = getArtifactOfTypes( | ||||
|     { key: solid2D.pathId, types: ['path'] }, | ||||
|     artifactGraph | ||||
| @ -704,7 +728,7 @@ export function getSolid2dCodeRef( | ||||
| export function getWallCodeRef( | ||||
|   wall: WallArtifact, | ||||
|   artifactGraph: ArtifactGraph | ||||
| ): CommonCommandProperties | Error { | ||||
| ): CodeRef | Error { | ||||
|   const seg = getArtifactOfTypes( | ||||
|     { key: wall.segId, types: ['segment'] }, | ||||
|     artifactGraph | ||||
| @ -716,7 +740,7 @@ export function getWallCodeRef( | ||||
| export function getSweepEdgeCodeRef( | ||||
|   edge: SweepEdge, | ||||
|   artifactGraph: ArtifactGraph | ||||
| ): CommonCommandProperties | Error { | ||||
| ): CodeRef | Error { | ||||
|   const seg = getArtifactOfTypes( | ||||
|     { key: edge.segId, types: ['segment'] }, | ||||
|     artifactGraph | ||||
| @ -751,3 +775,33 @@ export function getSweepFromSuspectedPath( | ||||
|     artifactGraph | ||||
|   ) | ||||
| } | ||||
|  | ||||
| export function getCodeRefsByArtifactId( | ||||
|   id: string, | ||||
|   artifactGraph: ArtifactGraph | ||||
| ): Array<CodeRef> | null { | ||||
|   const artifact = artifactGraph.get(id) | ||||
|   if (artifact?.type === 'solid2D') { | ||||
|     const codeRef = getSolid2dCodeRef(artifact, artifactGraph) | ||||
|     if (err(codeRef)) return null | ||||
|     return [codeRef] | ||||
|     // editorManager.setHighlightRange([codeRef.range]) | ||||
|   } else if (artifact?.type === 'cap') { | ||||
|     const codeRef = getCapCodeRef(artifact, artifactGraph) | ||||
|     if (err(codeRef)) return null | ||||
|     return [codeRef] | ||||
|   } else if (artifact?.type === 'wall') { | ||||
|     const extrusion = getSweepFromSuspectedSweepSurface(id, artifactGraph) | ||||
|     const codeRef = getWallCodeRef(artifact, artifactGraph) | ||||
|     if (err(codeRef)) return null | ||||
|     return err(extrusion) ? [codeRef] : [codeRef, extrusion.codeRef] | ||||
|   } else if (artifact?.type === 'sweepEdge') { | ||||
|     const codeRef = getSweepEdgeCodeRef(artifact, artifactGraph) | ||||
|     if (err(codeRef)) return null | ||||
|     return [codeRef] | ||||
|   } else if (artifact?.type === 'segment') { | ||||
|     return [artifact.codeRef] | ||||
|   } else { | ||||
|     return null | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -1912,11 +1912,13 @@ export function getConstraintInfo( | ||||
| ): ConstrainInfo[] { | ||||
|   const fnName = callExpression?.callee?.name || '' | ||||
|   if (!(fnName in sketchLineHelperMap)) return [] | ||||
|   return sketchLineHelperMap[fnName].getConstraintInfo( | ||||
|   const result = sketchLineHelperMap[fnName].getConstraintInfo( | ||||
|     callExpression, | ||||
|     code, | ||||
|     pathToNode | ||||
|   ) | ||||
|   // console.log('result path', result[0].pathToNode) | ||||
|   return result | ||||
| } | ||||
|  | ||||
| export function compareVec2Epsilon( | ||||
|  | ||||
| @ -11,7 +11,7 @@ import { | ||||
|   transformAstSketchLines, | ||||
| } from './sketchcombos' | ||||
| import { getSketchSegmentFromSourceRange } from './sketchConstraints' | ||||
| import { Selection } from 'lib/selections' | ||||
| import { Selection__old } from 'lib/selections' | ||||
| import { enginelessExecutor } from '../../lib/testHelpers' | ||||
| import { err } from 'lib/trap' | ||||
|  | ||||
| @ -33,7 +33,7 @@ async function testingSwapSketchFnCall({ | ||||
|   originalRange: [number, number] | ||||
| }> { | ||||
|   const startIndex = inputCode.indexOf(callToSwap) | ||||
|   const range: Selection = { | ||||
|   const range: Selection__old = { | ||||
|     type: 'default', | ||||
|     range: [startIndex, startIndex + callToSwap.length], | ||||
|   } | ||||
|  | ||||
| @ -9,7 +9,7 @@ import { | ||||
|   getConstraintLevelFromSourceRange, | ||||
| } from './sketchcombos' | ||||
| import { ToolTip } from 'lang/langHelpers' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { err } from 'lib/trap' | ||||
| import { enginelessExecutor } from '../../lib/testHelpers' | ||||
|  | ||||
| @ -87,8 +87,8 @@ function getConstraintTypeFromSourceHelper2( | ||||
| } | ||||
|  | ||||
| function makeSelections( | ||||
|   codeBaseSelections: Selections['codeBasedSelections'] | ||||
| ): Selections { | ||||
|   codeBaseSelections: Selections__old['codeBasedSelections'] | ||||
| ): Selections__old { | ||||
|   return { | ||||
|     codeBasedSelections: codeBaseSelections, | ||||
|     otherSelections: [], | ||||
| @ -208,7 +208,7 @@ const part001 = startSketchOn('XY') | ||||
|     const ast = parse(inputScript) | ||||
|     if (err(ast)) return Promise.reject(ast) | ||||
|  | ||||
|     const selectionRanges: Selections['codeBasedSelections'] = inputScript | ||||
|     const selectionRanges: Selections__old['codeBasedSelections'] = inputScript | ||||
|       .split('\n') | ||||
|       .filter((ln) => ln.includes('//')) | ||||
|       .map((ln) => { | ||||
| @ -299,7 +299,7 @@ const part001 = startSketchOn('XY') | ||||
|     const ast = parse(inputScript) | ||||
|     if (err(ast)) return Promise.reject(ast) | ||||
|  | ||||
|     const selectionRanges: Selections['codeBasedSelections'] = inputScript | ||||
|     const selectionRanges: Selections__old['codeBasedSelections'] = inputScript | ||||
|       .split('\n') | ||||
|       .filter((ln) => ln.includes('// select for horizontal constraint')) | ||||
|       .map((ln) => { | ||||
| @ -361,7 +361,7 @@ const part001 = startSketchOn('XY') | ||||
|     const ast = parse(inputScript) | ||||
|     if (err(ast)) return Promise.reject(ast) | ||||
|  | ||||
|     const selectionRanges: Selections['codeBasedSelections'] = inputScript | ||||
|     const selectionRanges: Selections__old['codeBasedSelections'] = inputScript | ||||
|       .split('\n') | ||||
|       .filter((ln) => ln.includes('// select for vertical constraint')) | ||||
|       .map((ln) => { | ||||
| @ -434,7 +434,7 @@ const part001 = startSketchOn('XY') | ||||
|        segEndY(seg01) + 2.93 | ||||
|      ], %) // xRelative`) | ||||
|     }) | ||||
|     it('testing for yRelative to horizontal distance', async () => { | ||||
|     it.only('testing for yRelative to horizontal distance', async () => { | ||||
|       const expectedCode = await helperThing( | ||||
|         inputScript, | ||||
|         ['// base selection', '// yRelative'], | ||||
| @ -456,7 +456,7 @@ async function helperThing( | ||||
|   const ast = parse(inputScript) | ||||
|   if (err(ast)) return Promise.reject(ast) | ||||
|  | ||||
|   const selectionRanges: Selections['codeBasedSelections'] = inputScript | ||||
|   const selectionRanges: Selections__old['codeBasedSelections'] = inputScript | ||||
|     .split('\n') | ||||
|     .filter((ln) => | ||||
|       linesOfInterest.some((lineOfInterest) => ln.includes(lineOfInterest)) | ||||
|  | ||||
| @ -7,7 +7,7 @@ import { | ||||
|   TransformInfo, | ||||
| } from './stdTypes' | ||||
| import { ToolTip, toolTips } from 'lang/langHelpers' | ||||
| import { Selections, Selection } from 'lib/selections' | ||||
| import { Selections__old, Selection__old } from 'lib/selections' | ||||
| import { cleanErrs, err } from 'lib/trap' | ||||
| import { | ||||
|   CallExpression, | ||||
| @ -1470,7 +1470,7 @@ export function getConstraintType( | ||||
| } | ||||
|  | ||||
| export function getTransformInfos( | ||||
|   selectionRanges: Selections, | ||||
|   selectionRanges: Selections__old, | ||||
|   ast: Program, | ||||
|   constraintType: ConstraintType | ||||
| ): TransformInfo[] { | ||||
| @ -1502,7 +1502,7 @@ export function getTransformInfos( | ||||
| } | ||||
|  | ||||
| export function getRemoveConstraintsTransforms( | ||||
|   selectionRanges: Selections, | ||||
|   selectionRanges: Selections__old, | ||||
|   ast: Program, | ||||
|   constraintType: ConstraintType | ||||
| ): TransformInfo[] | Error { | ||||
| @ -1542,7 +1542,7 @@ export function transformSecondarySketchLinesTagFirst({ | ||||
|   forceValueUsedInTransform, | ||||
| }: { | ||||
|   ast: Program | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   transformInfos: TransformInfo[] | ||||
|   programMemory: ProgramMemory | ||||
|   forceSegName?: string | ||||
| @ -1613,12 +1613,12 @@ export function transformAstSketchLines({ | ||||
|   referencedSegmentRange, | ||||
| }: { | ||||
|   ast: Program | ||||
|   selectionRanges: Selections | PathToNode[] | ||||
|   selectionRanges: Selections__old | PathToNode[] | ||||
|   transformInfos: TransformInfo[] | ||||
|   programMemory: ProgramMemory | ||||
|   referenceSegName: string | ||||
|   referencedSegmentRange?: Selection__old['range'] | ||||
|   forceValueUsedInTransform?: BinaryPart | ||||
|   referencedSegmentRange?: Selection['range'] | ||||
| }): | ||||
|   | { | ||||
|       modifiedAst: Program | ||||
| @ -1658,6 +1658,7 @@ export function transformAstSketchLines({ | ||||
|       '' | ||||
|     const inputs: InputArgs = [] | ||||
|  | ||||
|     console.log('getConstraintInfo', callExp.node, _pathToNode) | ||||
|     getConstraintInfo(callExp.node, '', _pathToNode).forEach((a) => { | ||||
|       if ( | ||||
|         a.type === 'tangentialWithPrevious' || | ||||
| @ -1822,7 +1823,7 @@ function getArgLiteralVal(arg: Literal): number | Error { | ||||
| export type ConstraintLevel = 'free' | 'partial' | 'full' | ||||
|  | ||||
| export function getConstraintLevelFromSourceRange( | ||||
|   cursorRange: Selection['range'], | ||||
|   cursorRange: Selection__old['range'], | ||||
|   ast: Program | Error | ||||
| ): Error | { range: [number, number]; level: ConstraintLevel } { | ||||
|   if (err(ast)) return ast | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { Program, PathToNode } from './wasm' | ||||
| import { getNodeFromPath } from './queryAst' | ||||
| import { ArtifactGraph, filterArtifacts } from 'lang/std/artifactGraph' | ||||
| @ -7,10 +7,10 @@ import { err } from 'lib/trap' | ||||
|  | ||||
| export function pathMapToSelections( | ||||
|   ast: Program, | ||||
|   prevSelections: Selections, | ||||
|   prevSelections: Selections__old, | ||||
|   pathToNodeMap: { [key: number]: PathToNode } | ||||
| ): Selections { | ||||
|   const newSelections: Selections = { | ||||
| ): Selections__old { | ||||
|   const newSelections: Selections__old = { | ||||
|     ...prevSelections, | ||||
|     codeBasedSelections: [], | ||||
|   } | ||||
| @ -47,7 +47,7 @@ export function updatePathToNodeFromMap( | ||||
|  | ||||
| export function isCursorInSketchCommandRange( | ||||
|   artifactGraph: ArtifactGraph, | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
| ): string | false { | ||||
|   const overlappingEntries = filterArtifacts( | ||||
|     { | ||||
|  | ||||
| @ -2,7 +2,7 @@ import { Models } from '@kittycad/lib' | ||||
| import { StateMachineCommandSetConfig, KclCommandValue } from 'lib/commandTypes' | ||||
| import { KCL_DEFAULT_LENGTH, KCL_DEFAULT_DEGREE } from 'lib/constants' | ||||
| import { components } from 'lib/machine-api' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { machineManager } from 'lib/machineManager' | ||||
| import { modelingMachine, SketchTool } from 'machines/modelingMachine' | ||||
|  | ||||
| @ -28,17 +28,17 @@ export type ModelingCommandSchema = { | ||||
|     machine: components['schemas']['MachineInfoResponse'] | ||||
|   } | ||||
|   Extrude: { | ||||
|     selection: Selections // & { type: 'face' } would be cool to lock that down | ||||
|     selection: Selections__old // & { type: 'face' } would be cool to lock that down | ||||
|     // result: (typeof EXTRUSION_RESULTS)[number] | ||||
|     distance: KclCommandValue | ||||
|   } | ||||
|   Revolve: { | ||||
|     selection: Selections | ||||
|     selection: Selections__old | ||||
|     angle: KclCommandValue | ||||
|   } | ||||
|   Fillet: { | ||||
|     // todo | ||||
|     selection: Selections | ||||
|     selection: Selections__old | ||||
|     radius: KclCommandValue | ||||
|   } | ||||
|   'change tool': { | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| import { CustomIconName } from 'components/CustomIcon' | ||||
| import { AllMachines } from 'hooks/useStateMachineCommands' | ||||
| import { Actor, AnyStateMachine, ContextFrom, EventFrom } from 'xstate' | ||||
| import { Selection } from './selections' | ||||
| import { Selection__old } from './selections' | ||||
| import { Identifier, Expr, VariableDeclaration } from 'lang/wasm' | ||||
| import { commandBarMachine } from 'machines/commandBarMachine' | ||||
| import { ReactNode } from 'react' | ||||
| @ -140,7 +140,7 @@ export type CommandArgumentConfig< | ||||
|     } | ||||
|   | { | ||||
|       inputType: 'selection' | ||||
|       selectionTypes: Selection['type'][] | ||||
|       selectionTypes: Selection__old['type'][] | ||||
|       multiple: boolean | ||||
|     } | ||||
|   | { inputType: 'kcl'; defaultValue?: string } // KCL expression inputs have simple strings as default values | ||||
| @ -213,7 +213,7 @@ export type CommandArgument< | ||||
|     } | ||||
|   | { | ||||
|       inputType: 'selection' | ||||
|       selectionTypes: Selection['type'][] | ||||
|       selectionTypes: Selection__old['type'][] | ||||
|       multiple: boolean | ||||
|     } | ||||
|   | { inputType: 'kcl'; defaultValue?: string } // KCL expression inputs have simple strings as default value | ||||
|  | ||||
| @ -28,12 +28,15 @@ import { AXIS_GROUP, X_AXIS } from 'clientSideScene/sceneInfra' | ||||
| import { PathToNodeMap } from 'lang/std/sketchcombos' | ||||
| import { err } from 'lib/trap' | ||||
| import { | ||||
|   Artifact, | ||||
|   getArtifactOfTypes, | ||||
|   getArtifactsOfTypes, | ||||
|   getCapCodeRef, | ||||
|   getSweepEdgeCodeRef, | ||||
|   getSolid2dCodeRef, | ||||
|   getWallCodeRef, | ||||
|   CodeRef, | ||||
|   getCodeRefsByArtifactId, | ||||
| } from 'lang/std/artifactGraph' | ||||
|  | ||||
| export const X_AXIS_UUID = 'ad792545-7fd3-482a-a602-a93924e3055b' | ||||
| @ -41,7 +44,8 @@ export const Y_AXIS_UUID = '680fd157-266f-4b8a-984f-cdf46b8bdf01' | ||||
|  | ||||
| export type Axis = 'y-axis' | 'x-axis' | 'z-axis' | ||||
|  | ||||
| export type Selection = { | ||||
| /** @deprecated Use {@link Artifact} instead. */ | ||||
| export type Selection__old = { | ||||
|   type: | ||||
|     | 'default' | ||||
|     | 'line-end' | ||||
| @ -58,9 +62,129 @@ export type Selection = { | ||||
|     | 'all' | ||||
|   range: SourceRange | ||||
| } | ||||
| export type Selections = { | ||||
| /** @deprecated Use {@link Selection} instead. */ | ||||
| export type Selections__old = { | ||||
|   otherSelections: Axis[] | ||||
|   codeBasedSelections: Selection[] | ||||
|   codeBasedSelections: Selection__old[] | ||||
| } | ||||
| export interface Selection { | ||||
|   artifact: Artifact | ||||
|   codeRef: CodeRef | ||||
| } | ||||
| export type Selections = { | ||||
|   otherSelections: Array<Axis> | ||||
|   graphSelections: Array<Selection> | ||||
| } | ||||
|  | ||||
| /** @deprecated If you're writing a new function, it should use {@link Selection} and not {@link Selection__old} | ||||
|  * this function should only be used for backwards compatibility with old functions. | ||||
|  */ | ||||
| export function convertSelectionToOld( | ||||
|   selection: Selection | ||||
| ): Selection__old | null { | ||||
|   // return {} as Selection__old | ||||
|   // TODO implementation | ||||
|   const _artifact = selection.artifact | ||||
|   if (_artifact.type === 'solid2D') { | ||||
|     const codeRef = getSolid2dCodeRef( | ||||
|       _artifact, | ||||
|       engineCommandManager.artifactGraph | ||||
|     ) | ||||
|     if (err(codeRef)) return null | ||||
|     return { range: codeRef.range, type: 'solid2D' } | ||||
|     // return { | ||||
|     //   type: 'Set selection', | ||||
|     //   data: { | ||||
|     //     selectionType: 'singleCodeCursor', | ||||
|  | ||||
|     //     selection: { range: codeRef.range, type: 'solid2D' }, | ||||
|     //   }, | ||||
|     // } | ||||
|   } | ||||
|   if (_artifact.type === 'cap') { | ||||
|     const codeRef = getCapCodeRef(_artifact, engineCommandManager.artifactGraph) | ||||
|     if (err(codeRef)) return null | ||||
|     return { | ||||
|       range: codeRef.range, | ||||
|       type: _artifact?.subType === 'end' ? 'end-cap' : 'start-cap', | ||||
|     } | ||||
|     // return { | ||||
|     //   type: 'Set selection', | ||||
|     //   data: { | ||||
|     //     selectionType: 'singleCodeCursor', | ||||
|     //     selection: { | ||||
|     //       range: codeRef.range, | ||||
|     //       type: _artifact?.subType === 'end' ? 'end-cap' : 'start-cap', | ||||
|     //     }, | ||||
|     //   }, | ||||
|     // } | ||||
|   } | ||||
|   if (_artifact.type === 'wall') { | ||||
|     const codeRef = getWallCodeRef( | ||||
|       _artifact, | ||||
|       engineCommandManager.artifactGraph | ||||
|     ) | ||||
|     if (err(codeRef)) return null | ||||
|     return { range: codeRef.range, type: 'extrude-wall' } | ||||
|     // return { | ||||
|     //   type: 'Set selection', | ||||
|     //   data: { | ||||
|     //     selectionType: 'singleCodeCursor', | ||||
|     //     selection: { range: codeRef.range, type: 'extrude-wall' }, | ||||
|     //   }, | ||||
|     // } | ||||
|   } | ||||
|   if (_artifact.type === 'segment' || _artifact.type === 'path') { | ||||
|     return { range: _artifact.codeRef.range, type: 'default' } | ||||
|     // return { | ||||
|     //   type: 'Set selection', | ||||
|     //   data: { | ||||
|     //     selectionType: 'singleCodeCursor', | ||||
|     //     selection: { range: _artifact.codeRef.range, type: 'default' }, | ||||
|     //   }, | ||||
|     // } | ||||
|   } | ||||
|   if (_artifact.type === 'sweepEdge') { | ||||
|     const codeRef = getSweepEdgeCodeRef( | ||||
|       _artifact, | ||||
|       engineCommandManager.artifactGraph | ||||
|     ) | ||||
|     if (err(codeRef)) return null | ||||
|     if (_artifact?.subType === 'adjacent') { | ||||
|       return { range: codeRef.range, type: 'adjacent-edge' } | ||||
|       // return { | ||||
|       //   type: 'Set selection', | ||||
|       //   data: { | ||||
|       //     selectionType: 'singleCodeCursor', | ||||
|       //     selection: { range: codeRef.range, type: 'adjacent-edge' }, | ||||
|       //   }, | ||||
|       // } | ||||
|     } | ||||
|     return { range: codeRef.range, type: 'edge' } | ||||
|     // return { | ||||
|     //   type: 'Set selection', | ||||
|     //   data: { | ||||
|     //     selectionType: 'singleCodeCursor', | ||||
|     //     selection: { range: codeRef.range, type: 'edge' }, | ||||
|     //   }, | ||||
|     // } | ||||
|   } | ||||
|   return null | ||||
| } | ||||
| /** @deprecated If you're writing a new function, it should use {@link Selection} and not {@link Selection__old} | ||||
|  * this function should only be used for backwards compatibility with old functions. | ||||
|  */ | ||||
| export function convertSelectionsToOld(selection: Selections): Selections__old { | ||||
|   const selections: Selection__old[] = [] | ||||
|   for (const artifact of selection.graphSelections) { | ||||
|     const converted = convertSelectionToOld(artifact) | ||||
|     if (converted) selections.push(converted) | ||||
|   } | ||||
|   const selectionsOld: Selections__old = { | ||||
|     otherSelections: selection.otherSelections, | ||||
|     codeBasedSelections: selections, | ||||
|   } | ||||
|   return selectionsOld | ||||
| } | ||||
|  | ||||
| export async function getEventForSelectWithPoint({ | ||||
| @ -85,85 +209,102 @@ export async function getEventForSelectWithPoint({ | ||||
|     } | ||||
|   } | ||||
|   let _artifact = engineCommandManager.artifactGraph.get(data.entity_id) | ||||
|   if (!_artifact) | ||||
|     return { | ||||
|       type: 'Set selection', | ||||
|       data: { selectionType: 'singleCodeCursor' }, | ||||
|     } | ||||
|   if (_artifact.type === 'solid2D') { | ||||
|     const codeRef = getSolid2dCodeRef( | ||||
|       _artifact, | ||||
|       engineCommandManager.artifactGraph | ||||
|     ) | ||||
|     if (err(codeRef)) return null | ||||
|     return { | ||||
|       type: 'Set selection', | ||||
|       data: { | ||||
|         selectionType: 'singleCodeCursor', | ||||
|         selection: { range: codeRef.range, type: 'solid2D' }, | ||||
|       }, | ||||
|     } | ||||
|   } | ||||
|   if (_artifact.type === 'cap') { | ||||
|     const codeRef = getCapCodeRef(_artifact, engineCommandManager.artifactGraph) | ||||
|     if (err(codeRef)) return null | ||||
|   const codeRefs = getCodeRefsByArtifactId( | ||||
|     data.entity_id, | ||||
|     engineCommandManager.artifactGraph | ||||
|   ) | ||||
|   if (_artifact && codeRefs) { | ||||
|     return { | ||||
|       type: 'Set selection', | ||||
|       data: { | ||||
|         selectionType: 'singleCodeCursor', | ||||
|         selection: { | ||||
|           range: codeRef.range, | ||||
|           type: _artifact?.subType === 'end' ? 'end-cap' : 'start-cap', | ||||
|           artifact: _artifact, | ||||
|           codeRef: codeRefs[0], | ||||
|         }, | ||||
|       }, | ||||
|     } | ||||
|   } | ||||
|   if (_artifact.type === 'wall') { | ||||
|     const codeRef = getWallCodeRef( | ||||
|       _artifact, | ||||
|       engineCommandManager.artifactGraph | ||||
|     ) | ||||
|     if (err(codeRef)) return null | ||||
|     return { | ||||
|       type: 'Set selection', | ||||
|       data: { | ||||
|         selectionType: 'singleCodeCursor', | ||||
|         selection: { range: codeRef.range, type: 'extrude-wall' }, | ||||
|       }, | ||||
|     } | ||||
|   } | ||||
|   if (_artifact.type === 'segment' || _artifact.type === 'path') { | ||||
|     return { | ||||
|       type: 'Set selection', | ||||
|       data: { | ||||
|         selectionType: 'singleCodeCursor', | ||||
|         selection: { range: _artifact.codeRef.range, type: 'default' }, | ||||
|       }, | ||||
|     } | ||||
|   } | ||||
|   if (_artifact.type === 'sweepEdge') { | ||||
|     const codeRef = getSweepEdgeCodeRef( | ||||
|       _artifact, | ||||
|       engineCommandManager.artifactGraph | ||||
|     ) | ||||
|     if (err(codeRef)) return null | ||||
|     if (_artifact?.subType === 'adjacent') { | ||||
|       return { | ||||
|         type: 'Set selection', | ||||
|         data: { | ||||
|           selectionType: 'singleCodeCursor', | ||||
|           selection: { range: codeRef.range, type: 'adjacent-edge' }, | ||||
|         }, | ||||
|       } | ||||
|     } | ||||
|     return { | ||||
|       type: 'Set selection', | ||||
|       data: { | ||||
|         selectionType: 'singleCodeCursor', | ||||
|         selection: { range: codeRef.range, type: 'edge' }, | ||||
|       }, | ||||
|     } | ||||
|   } | ||||
|   // if (!_artifact) | ||||
|   //   return { | ||||
|   //     type: 'Set selection', | ||||
|   //     data: { selectionType: 'singleCodeCursor' }, | ||||
|   //   } | ||||
|   // if (_artifact.type === 'solid2D') { | ||||
|   //   const codeRef = getSolid2dCodeRef( | ||||
|   //     _artifact, | ||||
|   //     engineCommandManager.artifactGraph | ||||
|   //   ) | ||||
|   //   if (err(codeRef)) return null | ||||
|   //   return { | ||||
|   //     type: 'Set selection', | ||||
|   //     data: { | ||||
|   //       selectionType: 'singleCodeCursor', | ||||
|  | ||||
|   //       // selection: { range: codeRef.range, type: 'solid2D' }, | ||||
|   //     }, | ||||
|   //   } | ||||
|   // } | ||||
|   // if (_artifact.type === 'cap') { | ||||
|   //   const codeRef = getCapCodeRef(_artifact, engineCommandManager.artifactGraph) | ||||
|   //   if (err(codeRef)) return null | ||||
|   //   return { | ||||
|   //     type: 'Set selection', | ||||
|   //     data: { | ||||
|   //       selectionType: 'singleCodeCursor', | ||||
|   //       selection: { | ||||
|   //         range: codeRef.range, | ||||
|   //         type: _artifact?.subType === 'end' ? 'end-cap' : 'start-cap', | ||||
|   //       }, | ||||
|   //     }, | ||||
|   //   } | ||||
|   // } | ||||
|   // if (_artifact.type === 'wall') { | ||||
|   //   const codeRef = getWallCodeRef( | ||||
|   //     _artifact, | ||||
|   //     engineCommandManager.artifactGraph | ||||
|   //   ) | ||||
|   //   if (err(codeRef)) return null | ||||
|   //   return { | ||||
|   //     type: 'Set selection', | ||||
|   //     data: { | ||||
|   //       selectionType: 'singleCodeCursor', | ||||
|   //       selection: { range: codeRef.range, type: 'extrude-wall' }, | ||||
|   //     }, | ||||
|   //   } | ||||
|   // } | ||||
|   // if (_artifact.type === 'segment' || _artifact.type === 'path') { | ||||
|   //   return { | ||||
|   //     type: 'Set selection', | ||||
|   //     data: { | ||||
|   //       selectionType: 'singleCodeCursor', | ||||
|   //       selection: { range: _artifact.codeRef.range, type: 'default' }, | ||||
|   //     }, | ||||
|   //   } | ||||
|   // } | ||||
|   // if (_artifact.type === 'sweepEdge') { | ||||
|   //   const codeRef = getSweepEdgeCodeRef( | ||||
|   //     _artifact, | ||||
|   //     engineCommandManager.artifactGraph | ||||
|   //   ) | ||||
|   //   if (err(codeRef)) return null | ||||
|   //   if (_artifact?.subType === 'adjacent') { | ||||
|   //     return { | ||||
|   //       type: 'Set selection', | ||||
|   //       data: { | ||||
|   //         selectionType: 'singleCodeCursor', | ||||
|   //         selection: { range: codeRef.range, type: 'adjacent-edge' }, | ||||
|   //       }, | ||||
|   //     } | ||||
|   //   } | ||||
|   //   return { | ||||
|   //     type: 'Set selection', | ||||
|   //     data: { | ||||
|   //       selectionType: 'singleCodeCursor', | ||||
|   //       selection: { range: codeRef.range, type: 'edge' }, | ||||
|   //     }, | ||||
|   //   } | ||||
|   // } | ||||
|   return null | ||||
| } | ||||
|  | ||||
| @ -182,36 +323,56 @@ export function getEventForSegmentSelection( | ||||
|       }, | ||||
|     } | ||||
|   } | ||||
|   const pathToNode = group?.userData?.pathToNode | ||||
|   if (!pathToNode) return null | ||||
|   // previous drags don't update ast for efficiency reasons | ||||
|   // So we want to make sure we have and updated ast with | ||||
|   // accurate source ranges | ||||
|   const updatedAst = parse(codeManager.code) | ||||
|   if (err(updatedAst)) return null | ||||
|  | ||||
|   const nodeMeta = getNodeFromPath<CallExpression>( | ||||
|     updatedAst, | ||||
|     pathToNode, | ||||
|     'CallExpression' | ||||
|   // console.log('group', group?.userData.) | ||||
|   const id = group?.userData?.id | ||||
|   if (!id) return null | ||||
|   const artifact = engineCommandManager.artifactGraph.get(id) | ||||
|   const codeRefs = getCodeRefsByArtifactId( | ||||
|     id, | ||||
|     engineCommandManager.artifactGraph | ||||
|   ) | ||||
|   if (err(nodeMeta)) return null | ||||
|  | ||||
|   const node = nodeMeta.node | ||||
|   const range: SourceRange = [node.start, node.end] | ||||
|   console.log('artifact', artifact, group.userData) | ||||
|   if (!artifact || !codeRefs) return null | ||||
|   return { | ||||
|     type: 'Set selection', | ||||
|     data: { | ||||
|       selectionType: 'singleCodeCursor', | ||||
|       selection: { range, type: 'default' }, | ||||
|       selection: { | ||||
|         artifact, | ||||
|         codeRef: codeRefs[0], | ||||
|       }, | ||||
|     }, | ||||
|   } | ||||
|   // const pathToNode = group?.userData?.pathToNode | ||||
|   // if (!pathToNode) return null | ||||
|   // // previous drags don't update ast for efficiency reasons | ||||
|   // // So we want to make sure we have and updated ast with | ||||
|   // // accurate source ranges | ||||
|   // const updatedAst = parse(codeManager.code) | ||||
|   // if (err(updatedAst)) return null | ||||
|  | ||||
|   // const nodeMeta = getNodeFromPath<CallExpression>( | ||||
|   //   updatedAst, | ||||
|   //   pathToNode, | ||||
|   //   'CallExpression' | ||||
|   // ) | ||||
|   // if (err(nodeMeta)) return null | ||||
|  | ||||
|   // const node = nodeMeta.node | ||||
|   // const range: SourceRange = [node.start, node.end] | ||||
|   // return { | ||||
|   //   type: 'Set selection', | ||||
|   //   data: { | ||||
|   //     selectionType: 'singleCodeCursor', | ||||
|   //     selection: { range, type: 'default' }, | ||||
|   //   }, | ||||
|   // } | ||||
| } | ||||
|  | ||||
| export function handleSelectionBatch({ | ||||
|   selections, | ||||
| }: { | ||||
|   selections: Selections | ||||
|   selections: Selections__old | ||||
| }): { | ||||
|   engineEvents: Models['WebSocketRequest_type'][] | ||||
|   codeMirrorSelection: EditorSelection | ||||
| @ -252,7 +413,7 @@ export function handleSelectionBatch({ | ||||
|   } | ||||
| } | ||||
|  | ||||
| type SelectionToEngine = { type: Selection['type']; id: string } | ||||
| type SelectionToEngine = { type: Selection__old['type']; id: string } | ||||
|  | ||||
| export function processCodeMirrorRanges({ | ||||
|   codeMirrorRanges, | ||||
| @ -260,14 +421,15 @@ export function processCodeMirrorRanges({ | ||||
|   isShiftDown, | ||||
| }: { | ||||
|   codeMirrorRanges: readonly SelectionRange[] | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   isShiftDown: boolean | ||||
| }): null | { | ||||
|   modelingEvent: ModelingMachineEvent | ||||
|   engineEvents: Models['WebSocketRequest_type'][] | ||||
| } { | ||||
|   const isChange = | ||||
|     codeMirrorRanges.length !== selectionRanges.codeBasedSelections.length || | ||||
|     // todo should this take old or new selections? | ||||
|     codeMirrorRanges.length !== selectionRanges?.codeBasedSelections?.length || | ||||
|     codeMirrorRanges.some(({ from, to }, i) => { | ||||
|       return ( | ||||
|         from !== selectionRanges.codeBasedSelections[i].range[0] || | ||||
| @ -276,7 +438,7 @@ export function processCodeMirrorRanges({ | ||||
|     }) | ||||
|  | ||||
|   if (!isChange) return null | ||||
|   const codeBasedSelections: Selections['codeBasedSelections'] = | ||||
|   const codeBasedSelections: Selections__old['codeBasedSelections'] = | ||||
|     codeMirrorRanges.map(({ from, to }) => { | ||||
|       return { | ||||
|         type: 'default', | ||||
| @ -285,6 +447,15 @@ export function processCodeMirrorRanges({ | ||||
|     }) | ||||
|   const idBasedSelections: SelectionToEngine[] = | ||||
|     codeToIdSelections(codeBasedSelections) | ||||
|   const artifacts: Selection[] = [] | ||||
|   for (const { id } of idBasedSelections) { | ||||
|     const artifact = engineCommandManager.artifactGraph.get(id) | ||||
|     const codeRefs = getCodeRefsByArtifactId( | ||||
|       id, | ||||
|       engineCommandManager.artifactGraph | ||||
|     ) | ||||
|     if (artifact && codeRefs) artifacts.push({ artifact, codeRef: codeRefs[0] }) | ||||
|   } | ||||
|  | ||||
|   if (!selectionRanges) return null | ||||
|   updateSceneObjectColors(codeBasedSelections) | ||||
| @ -295,7 +466,7 @@ export function processCodeMirrorRanges({ | ||||
|         selectionType: 'mirrorCodeMirrorSelections', | ||||
|         selection: { | ||||
|           otherSelections: isShiftDown ? selectionRanges.otherSelections : [], | ||||
|           codeBasedSelections, | ||||
|           graphSelections: artifacts, | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
| @ -303,7 +474,7 @@ export function processCodeMirrorRanges({ | ||||
|   } | ||||
| } | ||||
|  | ||||
| function updateSceneObjectColors(codeBasedSelections: Selection[]) { | ||||
| function updateSceneObjectColors(codeBasedSelections: Selection__old[]) { | ||||
|   const updated = kclManager.ast | ||||
|  | ||||
|   Object.values(sceneEntitiesManager.activeSegments).forEach((segmentGroup) => { | ||||
| @ -358,7 +529,7 @@ function resetAndSetEngineEntitySelectionCmds( | ||||
|   ] | ||||
| } | ||||
|  | ||||
| export function isSketchPipe(selectionRanges: Selections) { | ||||
| export function isSketchPipe(selectionRanges: Selections__old) { | ||||
|   if (!isSingleCursorInPipe(selectionRanges, kclManager.ast)) return false | ||||
|   return isCursorInSketchCommandRange( | ||||
|     engineCommandManager.artifactGraph, | ||||
| @ -367,14 +538,14 @@ export function isSketchPipe(selectionRanges: Selections) { | ||||
| } | ||||
|  | ||||
| export function isSelectionLastLine( | ||||
|   selectionRanges: Selections, | ||||
|   selectionRanges: Selections__old, | ||||
|   code: string, | ||||
|   i = 0 | ||||
| ) { | ||||
|   return selectionRanges.codeBasedSelections[i].range[1] === code.length | ||||
| } | ||||
|  | ||||
| export function isRangeBetweenCharacters(selectionRanges: Selections) { | ||||
| export function isRangeBetweenCharacters(selectionRanges: Selections__old) { | ||||
|   return ( | ||||
|     selectionRanges.codeBasedSelections.length === 1 && | ||||
|     selectionRanges.codeBasedSelections[0].range[0] === 0 && | ||||
| @ -383,11 +554,14 @@ export function isRangeBetweenCharacters(selectionRanges: Selections) { | ||||
| } | ||||
|  | ||||
| export type CommonASTNode = { | ||||
|   selection: Selection | ||||
|   selection: Selection__old | ||||
|   ast: Program | ||||
| } | ||||
|  | ||||
| function buildCommonNodeFromSelection(selectionRanges: Selections, i: number) { | ||||
| function buildCommonNodeFromSelection( | ||||
|   selectionRanges: Selections__old, | ||||
|   i: number | ||||
| ) { | ||||
|   return { | ||||
|     selection: selectionRanges.codeBasedSelections[i], | ||||
|     ast: kclManager.ast, | ||||
| @ -420,7 +594,7 @@ function nodeHasCircle(node: CommonASTNode) { | ||||
|   }) | ||||
| } | ||||
|  | ||||
| export function canSweepSelection(selection: Selections) { | ||||
| export function canSweepSelection(selection: Selections__old) { | ||||
|   const commonNodes = selection.codeBasedSelections.map((_, i) => | ||||
|     buildCommonNodeFromSelection(selection, i) | ||||
|   ) | ||||
| @ -433,7 +607,7 @@ export function canSweepSelection(selection: Selections) { | ||||
|   ) | ||||
| } | ||||
|  | ||||
| export function canFilletSelection(selection: Selections) { | ||||
| export function canFilletSelection(selection: Selections__old) { | ||||
|   const commonNodes = selection.codeBasedSelections.map((_, i) => | ||||
|     buildCommonNodeFromSelection(selection, i) | ||||
|   ) // TODO FILLET DUMMY PLACEHOLDER | ||||
| @ -444,7 +618,7 @@ export function canFilletSelection(selection: Selections) { | ||||
|   ) | ||||
| } | ||||
|  | ||||
| function canExtrudeSelectionItem(selection: Selections, i: number) { | ||||
| function canExtrudeSelectionItem(selection: Selections__old, i: number) { | ||||
|   const isolatedSelection = { | ||||
|     ...selection, | ||||
|     codeBasedSelections: [selection.codeBasedSelections[i]], | ||||
| @ -459,7 +633,7 @@ function canExtrudeSelectionItem(selection: Selections, i: number) { | ||||
| } | ||||
|  | ||||
| // This accounts for non-geometry selections under "other" | ||||
| export type ResolvedSelectionType = [Selection['type'] | 'other', number] | ||||
| export type ResolvedSelectionType = [Selection__old['type'] | 'other', number] | ||||
|  | ||||
| /** | ||||
|  * In the future, I'd like this function to properly return the type of each selected entity based on | ||||
| @ -469,7 +643,7 @@ export type ResolvedSelectionType = [Selection['type'] | 'other', number] | ||||
|  * @returns | ||||
|  */ | ||||
| export function getSelectionType( | ||||
|   selection?: Selections | ||||
|   selection?: Selections__old | ||||
| ): ResolvedSelectionType[] { | ||||
|   if (!selection) return [] | ||||
|   const extrudableCount = selection.codeBasedSelections.filter((_, i) => { | ||||
| @ -486,7 +660,7 @@ export function getSelectionType( | ||||
| } | ||||
|  | ||||
| export function getSelectionTypeDisplayText( | ||||
|   selection?: Selections | ||||
|   selection?: Selections__old | ||||
| ): string | null { | ||||
|   const selectionsByType = getSelectionType(selection) | ||||
|  | ||||
| @ -518,7 +692,7 @@ export function canSubmitSelectionArg( | ||||
| } | ||||
|  | ||||
| function codeToIdSelections( | ||||
|   codeBasedSelections: Selection[] | ||||
|   codeBasedSelections: Selection__old[] | ||||
| ): SelectionToEngine[] { | ||||
|   return codeBasedSelections | ||||
|     .flatMap(({ type, range, ...rest }): null | SelectionToEngine[] => { | ||||
| @ -684,13 +858,13 @@ export async function sendSelectEventToEngine( | ||||
|  | ||||
| export function updateSelections( | ||||
|   pathToNodeMap: PathToNodeMap, | ||||
|   prevSelectionRanges: Selections, | ||||
|   prevSelectionRanges: Selections__old, | ||||
|   ast: Program | Error | ||||
| ): Selections | Error { | ||||
| ): Selections__old | Error { | ||||
|   if (err(ast)) return ast | ||||
|  | ||||
|   const newSelections = Object.entries(pathToNodeMap) | ||||
|     .map(([index, pathToNode]): Selection | undefined => { | ||||
|     .map(([index, pathToNode]): Selection__old | undefined => { | ||||
|       const nodeMeta = getNodeFromPath<Expr>(ast, pathToNode) | ||||
|       if (err(nodeMeta)) return undefined | ||||
|       const node = nodeMeta.node | ||||
| @ -699,7 +873,7 @@ export function updateSelections( | ||||
|         type: prevSelectionRanges.codeBasedSelections[Number(index)]?.type, | ||||
|       } | ||||
|     }) | ||||
|     .filter((x?: Selection) => x !== undefined) as Selection[] | ||||
|     .filter((x?: Selection__old) => x !== undefined) as Selection__old[] | ||||
|  | ||||
|   return { | ||||
|     codeBasedSelections: | ||||
| @ -709,3 +883,74 @@ export function updateSelections( | ||||
|     otherSelections: prevSelectionRanges.otherSelections, | ||||
|   } | ||||
| } | ||||
|  | ||||
| // using artifact as the selection is maybe not such a good idea. | ||||
| // is the artifact stable, once you add a constrain, there will a new artifact graph | ||||
| // then the ids will not match up | ||||
| export function updateSelections2( | ||||
|   pathToNodeMap: PathToNodeMap, | ||||
|   prevSelectionRanges: Selections, | ||||
|   ast: Program | Error | ||||
| ): Selections | Error { | ||||
|   if (err(ast)) return ast | ||||
|  | ||||
|   const newSelections = Object.entries(pathToNodeMap) | ||||
|     .map(([index, pathToNode]): Selection | undefined => { | ||||
|       const previousSelection = | ||||
|         prevSelectionRanges.graphSelections[Number(index)] | ||||
|       const nodeMeta = getNodeFromPath<Expr>(ast, pathToNode) | ||||
|       if (err(nodeMeta)) return undefined | ||||
|       const node = nodeMeta.node | ||||
|       let artifact: Artifact | null = null | ||||
|       for (const [id, a] of engineCommandManager.artifactGraph) { | ||||
|         if (previousSelection.artifact.type === a.type) { | ||||
|           const codeRefs = getCodeRefsByArtifactId( | ||||
|             id, | ||||
|             engineCommandManager.artifactGraph | ||||
|           ) | ||||
|           console.log('codeRef', codeRefs) | ||||
|           if (!codeRefs) continue | ||||
|           if ( | ||||
|             JSON.stringify(codeRefs[0].pathToNode) === | ||||
|             JSON.stringify(pathToNode) | ||||
|           ) { | ||||
|             artifact = a | ||||
|             console.log('found artifact', a) | ||||
|             break | ||||
|           } | ||||
|         } | ||||
|         // if ( | ||||
|         //   a.codeRef.range[0] === node.start && | ||||
|         //   a.codeRef.range[1] === node.end | ||||
|         // ) { | ||||
|         //   artifact = a | ||||
|         //   break | ||||
|         // } | ||||
|       } | ||||
|       if (!artifact) return undefined | ||||
|       return { | ||||
|         artifact: artifact, | ||||
|         codeRef: { | ||||
|           range: [node.start, node.end], | ||||
|           pathToNode: pathToNode, | ||||
|         }, | ||||
|         // codeRef: { | ||||
|         //   range: [node.start, node.end], | ||||
|         //   pathToNode: pathToNode, | ||||
|         // }, | ||||
|       } | ||||
|       // return { | ||||
|       //   range: [node.start, node.end], | ||||
|       //   type: prevSelectionRanges.codeBasedSelections[Number(index)]?.type, | ||||
|       // } | ||||
|     }) | ||||
|     .filter((x?: Selection) => x !== undefined) as Selection[] | ||||
|  | ||||
|   return { | ||||
|     graphSelections: | ||||
|       newSelections.length > 0 | ||||
|         ? newSelections | ||||
|         : prevSelectionRanges.graphSelections, | ||||
|     otherSelections: prevSelectionRanges.otherSelections, | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -7,6 +7,7 @@ import { ProgramMemory, Expr, parse } from 'lang/wasm' | ||||
| import { useEffect, useRef, useState } from 'react' | ||||
| import { executeAst } from 'lang/langHelpers' | ||||
| import { err, trap } from 'lib/trap' | ||||
| import { convertSelectionsToOld } from './selections' | ||||
|  | ||||
| const isValidVariableName = (name: string) => | ||||
|   /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name) | ||||
| @ -34,9 +35,10 @@ export function useCalculateKclExpression({ | ||||
| } { | ||||
|   const { programMemory, code } = useKclContext() | ||||
|   const { context } = useModelingContext() | ||||
|   const selectionOld = convertSelectionsToOld(context.selectionRanges) | ||||
|   const selectionRange: | ||||
|     | (typeof context.selectionRanges.codeBasedSelections)[number]['range'] | ||||
|     | undefined = context.selectionRanges.codeBasedSelections[0]?.range | ||||
|     | (typeof selectionOld.codeBasedSelections)[number]['range'] | ||||
|     | undefined = selectionOld.codeBasedSelections[0]?.range | ||||
|   const inputRef = useRef<HTMLInputElement>(null) | ||||
|   const [availableVarInfo, setAvailableVarInfo] = useState< | ||||
|     ReturnType<typeof findAllPreviousVariables> | ||||
|  | ||||
| @ -3,12 +3,13 @@ import { kclManager } from 'lib/singletons' | ||||
| import { useKclContext } from 'lang/KclProvider' | ||||
| import { findAllPreviousVariables } from 'lang/queryAst' | ||||
| import { useEffect, useState } from 'react' | ||||
| import { convertSelectionsToOld } from './selections' | ||||
|  | ||||
| export function usePreviousVariables() { | ||||
|   const { programMemory, code } = useKclContext() | ||||
|   const { context } = useModelingContext() | ||||
|   const selectionRange = context.selectionRanges.codeBasedSelections[0] | ||||
|     ?.range || [code.length, code.length] | ||||
|   const selectionRange = convertSelectionsToOld(context.selectionRanges) | ||||
|     .codeBasedSelections[0]?.range || [code.length, code.length] | ||||
|   const [previousVariablesInfo, setPreviousVariablesInfo] = useState< | ||||
|     ReturnType<typeof findAllPreviousVariables> | ||||
|   >({ | ||||
|  | ||||
| @ -5,14 +5,14 @@ import { | ||||
|   CommandArgumentWithName, | ||||
|   KclCommandValue, | ||||
| } from 'lib/commandTypes' | ||||
| import { Selections } from 'lib/selections' | ||||
| import { Selections__old } from 'lib/selections' | ||||
| import { getCommandArgumentKclValuesOnly } from 'lib/commandUtils' | ||||
|  | ||||
| export type CommandBarContext = { | ||||
|   commands: Command[] | ||||
|   selectedCommand?: Command | ||||
|   currentArgument?: CommandArgument<unknown> & { name: string } | ||||
|   selectionRanges: Selections | ||||
|   selectionRanges: Selections__old | ||||
|   argumentsToSubmit: { [x: string]: unknown } | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -5,7 +5,14 @@ import { | ||||
|   parse, | ||||
|   recast, | ||||
| } from 'lang/wasm' | ||||
| import { Axis, Selection, Selections, updateSelections } from 'lib/selections' | ||||
| import { | ||||
|   Axis, | ||||
|   convertSelectionsToOld, | ||||
|   convertSelectionToOld, | ||||
|   Selections, | ||||
|   Selection, | ||||
|   updateSelections, | ||||
| } from 'lib/selections' | ||||
| import { assign, fromPromise, setup } from 'xstate' | ||||
| import { SidebarType } from 'components/ModelingSidebar/ModelingPanes' | ||||
| import { | ||||
| @ -299,7 +306,7 @@ export const modelingMachineDefaultContext: ModelingMachineContext = { | ||||
|   selection: [], | ||||
|   selectionRanges: { | ||||
|     otherSelections: [], | ||||
|     codeBasedSelections: [], | ||||
|     graphSelections: [], | ||||
|   }, | ||||
|   sketchDetails: { | ||||
|     sketchPathToNode: [], | ||||
| @ -350,18 +357,24 @@ export const modelingMachine = setup({ | ||||
|     'is editing existing sketch': ({ context: { sketchDetails } }) => | ||||
|       isEditingExistingSketch({ sketchDetails }), | ||||
|     'Can make selection horizontal': ({ context: { selectionRanges } }) => { | ||||
|       const info = horzVertInfo(selectionRanges, 'horizontal') | ||||
|       const info = horzVertInfo( | ||||
|         convertSelectionsToOld(selectionRanges), | ||||
|         'horizontal' | ||||
|       ) | ||||
|       if (trap(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
|     'Can make selection vertical': ({ context: { selectionRanges } }) => { | ||||
|       const info = horzVertInfo(selectionRanges, 'vertical') | ||||
|       const info = horzVertInfo( | ||||
|         convertSelectionsToOld(selectionRanges), | ||||
|         'vertical' | ||||
|       ) | ||||
|       if (trap(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
|     'Can constrain horizontal distance': ({ context: { selectionRanges } }) => { | ||||
|       const info = horzVertDistanceInfo({ | ||||
|         selectionRanges, | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         constraint: 'setHorzDistance', | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
| @ -369,47 +382,59 @@ export const modelingMachine = setup({ | ||||
|     }, | ||||
|     'Can constrain vertical distance': ({ context: { selectionRanges } }) => { | ||||
|       const info = horzVertDistanceInfo({ | ||||
|         selectionRanges, | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         constraint: 'setVertDistance', | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
|     'Can constrain ABS X': ({ context: { selectionRanges } }) => { | ||||
|       const info = absDistanceInfo({ selectionRanges, constraint: 'xAbs' }) | ||||
|       const info = absDistanceInfo({ | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         constraint: 'xAbs', | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
|     'Can constrain ABS Y': ({ context: { selectionRanges } }) => { | ||||
|       const info = absDistanceInfo({ selectionRanges, constraint: 'yAbs' }) | ||||
|       const info = absDistanceInfo({ | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         constraint: 'yAbs', | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
|     'Can constrain angle': ({ context: { selectionRanges } }) => { | ||||
|       const angleBetween = angleBetweenInfo({ selectionRanges }) | ||||
|       const angleBetween = angleBetweenInfo({ | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|       }) | ||||
|       if (trap(angleBetween)) return false | ||||
|       const angleLength = angleLengthInfo({ | ||||
|         selectionRanges, | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         angleOrLength: 'setAngle', | ||||
|       }) | ||||
|       if (trap(angleLength)) return false | ||||
|       return angleBetween.enabled || angleLength.enabled | ||||
|     }, | ||||
|     'Can constrain length': ({ context: { selectionRanges } }) => { | ||||
|       const angleLength = angleLengthInfo({ selectionRanges }) | ||||
|       const angleLength = angleLengthInfo({ | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|       }) | ||||
|       if (trap(angleLength)) return false | ||||
|       return angleLength.enabled | ||||
|     }, | ||||
|     'Can constrain perpendicular distance': ({ | ||||
|       context: { selectionRanges }, | ||||
|     }) => { | ||||
|       const info = intersectInfo({ selectionRanges }) | ||||
|       const info = intersectInfo({ | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
|     'Can constrain horizontally align': ({ context: { selectionRanges } }) => { | ||||
|       const info = horzVertDistanceInfo({ | ||||
|         selectionRanges, | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         constraint: 'setHorzDistance', | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
| @ -417,7 +442,7 @@ export const modelingMachine = setup({ | ||||
|     }, | ||||
|     'Can constrain vertically align': ({ context: { selectionRanges } }) => { | ||||
|       const info = horzVertDistanceInfo({ | ||||
|         selectionRanges, | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         constraint: 'setHorzDistance', | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
| @ -425,7 +450,7 @@ export const modelingMachine = setup({ | ||||
|     }, | ||||
|     'Can constrain snap to X': ({ context: { selectionRanges } }) => { | ||||
|       const info = absDistanceInfo({ | ||||
|         selectionRanges, | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         constraint: 'snapToXAxis', | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
| @ -433,19 +458,23 @@ export const modelingMachine = setup({ | ||||
|     }, | ||||
|     'Can constrain snap to Y': ({ context: { selectionRanges } }) => { | ||||
|       const info = absDistanceInfo({ | ||||
|         selectionRanges, | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         constraint: 'snapToYAxis', | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
|     'Can constrain equal length': ({ context: { selectionRanges } }) => { | ||||
|       const info = setEqualLengthInfo({ selectionRanges }) | ||||
|       const info = setEqualLengthInfo({ | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
|     'Can canstrain parallel': ({ context: { selectionRanges } }) => { | ||||
|       const info = equalAngleInfo({ selectionRanges }) | ||||
|       const info = equalAngleInfo({ | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|       }) | ||||
|       if (err(info)) return false | ||||
|       return info.enabled | ||||
|     }, | ||||
| @ -455,7 +484,7 @@ export const modelingMachine = setup({ | ||||
|     }) => { | ||||
|       if (event.type !== 'Constrain remove constraints') return false | ||||
|       const info = removeConstrainingValuesInfo({ | ||||
|         selectionRanges, | ||||
|         selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         pathToNodes: event.data && [event.data], | ||||
|       }) | ||||
|       if (trap(info)) return false | ||||
| @ -636,10 +665,14 @@ export const modelingMachine = setup({ | ||||
|     'AST delete selection': ({ context: { selectionRanges } }) => { | ||||
|       ;(async () => { | ||||
|         let ast = kclManager.ast | ||||
|         const oldSelection = convertSelectionToOld( | ||||
|           selectionRanges.graphSelections[0] | ||||
|         ) | ||||
|         if (!oldSelection) return | ||||
|  | ||||
|         const modifiedAst = await deleteFromSelection( | ||||
|           ast, | ||||
|           selectionRanges.codeBasedSelections[0], | ||||
|           oldSelection, | ||||
|           kclManager.programMemory, | ||||
|           getFaceDetails | ||||
|         ) | ||||
| @ -709,7 +742,7 @@ export const modelingMachine = setup({ | ||||
|           up: sketchDetails.yAxis, | ||||
|           position: sketchDetails.origin, | ||||
|           maybeModdedAst: kclManager.ast, | ||||
|           selectionRanges, | ||||
|           selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         }) | ||||
|         sceneInfra.resetMouseListeners() | ||||
|         sceneEntitiesManager.setupSketchIdleCallbacks({ | ||||
| @ -939,7 +972,7 @@ export const modelingMachine = setup({ | ||||
|         > & { data?: PathToNode } | ||||
|       }) => { | ||||
|         const constraint = applyRemoveConstrainingValues({ | ||||
|           selectionRanges, | ||||
|           selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|           pathToNodes: data && [data], | ||||
|         }) | ||||
|         if (trap(constraint)) return | ||||
| @ -958,7 +991,7 @@ export const modelingMachine = setup({ | ||||
|           selectionType: 'completeSelection', | ||||
|           selection: updateSelections( | ||||
|             pathToNodeMap, | ||||
|             selectionRanges, | ||||
|             convertSelectionsToOld(selectionRanges), | ||||
|             updatedAst.newAst | ||||
|           ), | ||||
|         } | ||||
| @ -971,7 +1004,7 @@ export const modelingMachine = setup({ | ||||
|         input: Pick<ModelingMachineContext, 'selectionRanges' | 'sketchDetails'> | ||||
|       }) => { | ||||
|         const constraint = applyConstraintHorzVert( | ||||
|           selectionRanges, | ||||
|           convertSelectionsToOld(selectionRanges), | ||||
|           'horizontal', | ||||
|           kclManager.ast, | ||||
|           kclManager.programMemory | ||||
| @ -992,7 +1025,7 @@ export const modelingMachine = setup({ | ||||
|           selectionType: 'completeSelection', | ||||
|           selection: updateSelections( | ||||
|             pathToNodeMap, | ||||
|             selectionRanges, | ||||
|             convertSelectionsToOld(selectionRanges), | ||||
|             updatedAst.newAst | ||||
|           ), | ||||
|         } | ||||
| @ -1005,7 +1038,7 @@ export const modelingMachine = setup({ | ||||
|         input: Pick<ModelingMachineContext, 'selectionRanges' | 'sketchDetails'> | ||||
|       }) => { | ||||
|         const constraint = applyConstraintHorzVert( | ||||
|           selectionRanges, | ||||
|           convertSelectionsToOld(selectionRanges), | ||||
|           'vertical', | ||||
|           kclManager.ast, | ||||
|           kclManager.programMemory | ||||
| @ -1026,7 +1059,7 @@ export const modelingMachine = setup({ | ||||
|           selectionType: 'completeSelection', | ||||
|           selection: updateSelections( | ||||
|             pathToNodeMap, | ||||
|             selectionRanges, | ||||
|             convertSelectionsToOld(selectionRanges), | ||||
|             updatedAst.newAst | ||||
|           ), | ||||
|         } | ||||
| @ -1039,7 +1072,7 @@ export const modelingMachine = setup({ | ||||
|         input: Pick<ModelingMachineContext, 'selectionRanges' | 'sketchDetails'> | ||||
|       }) => { | ||||
|         const constraint = applyConstraintHorzVertAlign({ | ||||
|           selectionRanges, | ||||
|           selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|           constraint: 'setVertDistance', | ||||
|         }) | ||||
|         if (trap(constraint)) return | ||||
| @ -1056,7 +1089,7 @@ export const modelingMachine = setup({ | ||||
|         if (!updatedAst) return | ||||
|         const updatedSelectionRanges = updateSelections( | ||||
|           pathToNodeMap, | ||||
|           selectionRanges, | ||||
|           convertSelectionsToOld(selectionRanges), | ||||
|           updatedAst.newAst | ||||
|         ) | ||||
|         return { | ||||
| @ -1072,7 +1105,7 @@ export const modelingMachine = setup({ | ||||
|         input: Pick<ModelingMachineContext, 'selectionRanges' | 'sketchDetails'> | ||||
|       }) => { | ||||
|         const constraint = applyConstraintHorzVertAlign({ | ||||
|           selectionRanges, | ||||
|           selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|           constraint: 'setHorzDistance', | ||||
|         }) | ||||
|         if (trap(constraint)) return | ||||
| @ -1089,7 +1122,7 @@ export const modelingMachine = setup({ | ||||
|         if (!updatedAst) return | ||||
|         const updatedSelectionRanges = updateSelections( | ||||
|           pathToNodeMap, | ||||
|           selectionRanges, | ||||
|           convertSelectionsToOld(selectionRanges), | ||||
|           updatedAst.newAst | ||||
|         ) | ||||
|         return { | ||||
| @ -1105,7 +1138,7 @@ export const modelingMachine = setup({ | ||||
|         input: Pick<ModelingMachineContext, 'selectionRanges' | 'sketchDetails'> | ||||
|       }) => { | ||||
|         const constraint = applyConstraintAxisAlign({ | ||||
|           selectionRanges, | ||||
|           selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|           constraint: 'snapToXAxis', | ||||
|         }) | ||||
|         if (err(constraint)) return false | ||||
| @ -1122,7 +1155,7 @@ export const modelingMachine = setup({ | ||||
|         if (!updatedAst) return | ||||
|         const updatedSelectionRanges = updateSelections( | ||||
|           pathToNodeMap, | ||||
|           selectionRanges, | ||||
|           convertSelectionsToOld(selectionRanges), | ||||
|           updatedAst.newAst | ||||
|         ) | ||||
|         return { | ||||
| @ -1138,7 +1171,7 @@ export const modelingMachine = setup({ | ||||
|         input: Pick<ModelingMachineContext, 'selectionRanges' | 'sketchDetails'> | ||||
|       }) => { | ||||
|         const constraint = applyConstraintAxisAlign({ | ||||
|           selectionRanges, | ||||
|           selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|           constraint: 'snapToYAxis', | ||||
|         }) | ||||
|         if (trap(constraint)) return false | ||||
| @ -1155,7 +1188,7 @@ export const modelingMachine = setup({ | ||||
|         if (!updatedAst) return | ||||
|         const updatedSelectionRanges = updateSelections( | ||||
|           pathToNodeMap, | ||||
|           selectionRanges, | ||||
|           convertSelectionsToOld(selectionRanges), | ||||
|           updatedAst.newAst | ||||
|         ) | ||||
|         return { | ||||
| @ -1171,7 +1204,7 @@ export const modelingMachine = setup({ | ||||
|         input: Pick<ModelingMachineContext, 'selectionRanges' | 'sketchDetails'> | ||||
|       }) => { | ||||
|         const constraint = applyConstraintEqualAngle({ | ||||
|           selectionRanges, | ||||
|           selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         }) | ||||
|         if (trap(constraint)) return false | ||||
|         const { modifiedAst, pathToNodeMap } = constraint | ||||
| @ -1192,7 +1225,7 @@ export const modelingMachine = setup({ | ||||
|         if (!updatedAst) return | ||||
|         const updatedSelectionRanges = updateSelections( | ||||
|           pathToNodeMap, | ||||
|           selectionRanges, | ||||
|           convertSelectionsToOld(selectionRanges), | ||||
|           updatedAst.newAst | ||||
|         ) | ||||
|         return { | ||||
| @ -1208,7 +1241,7 @@ export const modelingMachine = setup({ | ||||
|         input: Pick<ModelingMachineContext, 'selectionRanges' | 'sketchDetails'> | ||||
|       }) => { | ||||
|         const constraint = applyConstraintEqualLength({ | ||||
|           selectionRanges, | ||||
|           selectionRanges: convertSelectionsToOld(selectionRanges), | ||||
|         }) | ||||
|         if (trap(constraint)) return false | ||||
|         const { modifiedAst, pathToNodeMap } = constraint | ||||
| @ -1224,7 +1257,7 @@ export const modelingMachine = setup({ | ||||
|         if (!updatedAst) return | ||||
|         const updatedSelectionRanges = updateSelections( | ||||
|           pathToNodeMap, | ||||
|           selectionRanges, | ||||
|           convertSelectionsToOld(selectionRanges), | ||||
|           updatedAst.newAst | ||||
|         ) | ||||
|         return { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	