Handle walls
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
import { err, reportRejection, trap } from 'lib/trap'
|
||||
import { Selection } from 'lib/selections'
|
||||
import { Selection, Selections } from 'lib/selections'
|
||||
import {
|
||||
Program,
|
||||
CallExpression,
|
||||
@ -45,7 +45,11 @@ import { TagDeclarator } from 'wasm-lib/kcl/bindings/TagDeclarator'
|
||||
import { Models } from '@kittycad/lib'
|
||||
import { ExtrudeFacePlane } from 'machines/modelingMachine'
|
||||
import { Node } from 'wasm-lib/kcl/bindings/Node'
|
||||
import { Artifact } from './std/artifactGraph'
|
||||
import { Artifact, ArtifactGraph } from './std/artifactGraph'
|
||||
import {
|
||||
getPathToExtrudeForSegmentSelection,
|
||||
mutateAstWithTagForSketchSegment,
|
||||
} from './modifyAst/addEdgeTreatment'
|
||||
|
||||
export function startSketchOnDefault(
|
||||
node: Node<Program>,
|
||||
@ -603,34 +607,83 @@ export function addOffsetPlane({
|
||||
*/
|
||||
export function addShell({
|
||||
node,
|
||||
extrudeNode,
|
||||
selectedArtifact,
|
||||
selection,
|
||||
artifactGraph,
|
||||
thickness,
|
||||
}: {
|
||||
node: Node<Program>
|
||||
extrudeNode: {
|
||||
node: VariableDeclarator
|
||||
shallowPath: PathToNode
|
||||
deepPath: PathToNode
|
||||
}
|
||||
selectedArtifact: Artifact
|
||||
selection: Selections
|
||||
artifactGraph: ArtifactGraph
|
||||
thickness: Expr
|
||||
}): { modifiedAst: Node<Program>; pathToNode: PathToNode } {
|
||||
}): Error | { modifiedAst: Node<Program>; pathToNode: PathToNode } {
|
||||
const modifiedAst = structuredClone(node)
|
||||
|
||||
const graphSelection = selection.graphSelections[0]
|
||||
if (!(graphSelection && graphSelection instanceof Object)) {
|
||||
return Error('No plane selected')
|
||||
}
|
||||
|
||||
// Get the sketch ref from the selection
|
||||
const sketchNode = getNodeFromPath<VariableDeclarator>(
|
||||
modifiedAst,
|
||||
graphSelection.codeRef.pathToNode,
|
||||
'VariableDeclarator'
|
||||
)
|
||||
if (err(sketchNode)) {
|
||||
return sketchNode
|
||||
}
|
||||
|
||||
// Look up the corresponding extrude
|
||||
const clonedAstForGetExtrude = structuredClone(modifiedAst)
|
||||
const extrudeLookupResult = getPathToExtrudeForSegmentSelection(
|
||||
clonedAstForGetExtrude,
|
||||
selection,
|
||||
artifactGraph
|
||||
)
|
||||
if (err(extrudeLookupResult)) {
|
||||
return new Error("Couldn't find extrude")
|
||||
}
|
||||
|
||||
const extrudeNode = getNodeFromPath<VariableDeclarator>(
|
||||
modifiedAst,
|
||||
extrudeLookupResult.pathToExtrudeNode,
|
||||
'VariableDeclarator'
|
||||
)
|
||||
if (err(extrudeNode)) {
|
||||
return extrudeNode
|
||||
}
|
||||
|
||||
const selectedArtifact = graphSelection.artifact
|
||||
if (!selectedArtifact || !selectedArtifact) {
|
||||
return new Error('Bad artifact')
|
||||
}
|
||||
|
||||
// Check on the selection, and handle the wall vs cap casees
|
||||
let expr: Expr
|
||||
if (selectedArtifact.type === 'cap') {
|
||||
expr = createLiteral(selectedArtifact['subType'])
|
||||
} else {
|
||||
const tagResult = mutateAstWithTagForSketchSegment(
|
||||
modifiedAst,
|
||||
extrudeLookupResult.pathToSegmentNode
|
||||
)
|
||||
if (err(tagResult)) return tagResult
|
||||
const { tag } = tagResult
|
||||
expr = createIdentifier(tag)
|
||||
}
|
||||
|
||||
const name = findUniqueName(node, KCL_DEFAULT_CONSTANT_PREFIXES.SHELL)
|
||||
const shell = createCallExpressionStdLib('shell', [
|
||||
createObjectExpression({
|
||||
faces: createArrayExpression([
|
||||
// TODO: make typescript happy
|
||||
createLiteral(selectedArtifact['subType']),
|
||||
]),
|
||||
faces: createArrayExpression([expr]),
|
||||
thickness,
|
||||
}),
|
||||
createIdentifier(extrudeNode.node.id.name),
|
||||
])
|
||||
const declaration = createVariableDeclaration(name, shell)
|
||||
modifiedAst.body.push(declaration)
|
||||
|
||||
// TODO: check if we should append at the end like here or right after the extrude
|
||||
modifiedAst.body.push(declaration)
|
||||
const pathToNode: PathToNode = [
|
||||
['body', ''],
|
||||
[modifiedAst.body.length - 1, 'index'],
|
||||
|
||||
@ -308,7 +308,7 @@ async function updateAstAndFocus(
|
||||
}
|
||||
}
|
||||
|
||||
function mutateAstWithTagForSketchSegment(
|
||||
export function mutateAstWithTagForSketchSegment(
|
||||
astClone: Node<Program>,
|
||||
pathToSegmentNode: PathToNode
|
||||
): { modifiedAst: Program; tag: string } | Error {
|
||||
|
||||
@ -1591,14 +1591,13 @@ export const modelingMachine = setup({
|
||||
}: {
|
||||
input: ModelingCommandSchema['Shell'] | undefined
|
||||
}) => {
|
||||
if (!input) return new Error('No input provided')
|
||||
if (!input) {
|
||||
return new Error('No input provided')
|
||||
}
|
||||
|
||||
// Extract inputs
|
||||
const ast = kclManager.ast
|
||||
const { selection, thickness } = input
|
||||
const graphSelection = selection.graphSelections[0]
|
||||
if (!(graphSelection && graphSelection instanceof Object)) {
|
||||
return trap('No plane selected')
|
||||
}
|
||||
|
||||
// Insert the thickness variable if it exists
|
||||
if (
|
||||
@ -1615,49 +1614,19 @@ export const modelingMachine = setup({
|
||||
ast.body = newBody
|
||||
}
|
||||
|
||||
// Get the shell from the selection
|
||||
const sketchNode = getNodeFromPath<VariableDeclarator>(
|
||||
ast,
|
||||
graphSelection.codeRef.pathToNode,
|
||||
'VariableDeclarator'
|
||||
)
|
||||
if (err(sketchNode)) {
|
||||
return sketchNode
|
||||
}
|
||||
|
||||
const clonedAstForGetExtrude = structuredClone(ast)
|
||||
const extrudeLookupResult = getPathToExtrudeForSegmentSelection(
|
||||
clonedAstForGetExtrude,
|
||||
selection,
|
||||
engineCommandManager.artifactGraph
|
||||
)
|
||||
if (err(extrudeLookupResult)) {
|
||||
return new Error("Couldn't find extrude")
|
||||
}
|
||||
|
||||
const extrudeNode = getNodeFromPath<VariableDeclarator>(
|
||||
ast,
|
||||
extrudeLookupResult.pathToExtrudeNode,
|
||||
'VariableDeclarator'
|
||||
)
|
||||
if (err(extrudeNode)) {
|
||||
return extrudeNode
|
||||
}
|
||||
|
||||
const selectedArtifact = graphSelection.artifact
|
||||
if (!selectedArtifact || !selectedArtifact) {
|
||||
return new Error('Bad artifact')
|
||||
}
|
||||
|
||||
// Perform the shell op
|
||||
const shellResult = addShell({
|
||||
node: ast,
|
||||
extrudeNode,
|
||||
selectedArtifact,
|
||||
selection,
|
||||
artifactGraph: engineCommandManager.artifactGraph,
|
||||
thickness:
|
||||
'variableName' in thickness
|
||||
? thickness.variableIdentifierAst
|
||||
: thickness.valueAst,
|
||||
})
|
||||
if (err(shellResult)) {
|
||||
throw err(shellResult)
|
||||
}
|
||||
|
||||
const updateAstResult = await kclManager.updateAst(
|
||||
shellResult.modifiedAst,
|
||||
|
||||
Reference in New Issue
Block a user