Compare commits
2 Commits
kcl-81
...
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