* git mv src/wasm-lib rust Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv wasm-lib to workspace Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv kcl-lib Signed-off-by: Jess Frazelle <github@jessfraz.com> * mv derive docs Signed-off-by: Jess Frazelle <github@jessfraz.com> * resolve file paths Signed-off-by: Jess Frazelle <github@jessfraz.com> * clippy Signed-off-by: Jess Frazelle <github@jessfraz.com> * move more shit Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix more paths Signed-off-by: Jess Frazelle <github@jessfraz.com> * make yarn build:wasm work Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix scripts Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> * better references Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix cargo ci Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix reference Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix more ci Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> * cargo sort Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix script Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix Signed-off-by: Jess Frazelle <github@jessfraz.com> * fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix a dep Signed-off-by: Jess Frazelle <github@jessfraz.com> * sort Signed-off-by: Jess Frazelle <github@jessfraz.com> * remove unused deps Signed-off-by: Jess Frazelle <github@jessfraz.com> * Revert "remove unused deps" This reverts commit fbabdb062e275fd5cbc1476f8480a1afee15d972. * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * deps; Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
136 lines
4.1 KiB
TypeScript
136 lines
4.1 KiB
TypeScript
import { Selections } from 'lib/selections'
|
|
import { Expr } from '@rust/kcl-lib/bindings/Expr'
|
|
import { Program } from '@rust/kcl-lib/bindings/Program'
|
|
import { Node } from '@rust/kcl-lib/bindings/Node'
|
|
import { ArtifactGraph, PathToNode, VariableDeclarator } from 'lang/wasm'
|
|
import {
|
|
getPathToExtrudeForSegmentSelection,
|
|
mutateAstWithTagForSketchSegment,
|
|
} from './addEdgeTreatment'
|
|
import { getNodeFromPath } from 'lang/queryAst'
|
|
import { err } from 'lib/trap'
|
|
import {
|
|
createLiteral,
|
|
createIdentifier,
|
|
findUniqueName,
|
|
createArrayExpression,
|
|
createVariableDeclaration,
|
|
createCallExpressionStdLibKw,
|
|
createLabeledArg,
|
|
} from 'lang/modifyAst'
|
|
import { KCL_DEFAULT_CONSTANT_PREFIXES } from 'lib/constants'
|
|
|
|
export function addShell({
|
|
node,
|
|
selection,
|
|
artifactGraph,
|
|
thickness,
|
|
}: {
|
|
node: Node<Program>
|
|
selection: Selections
|
|
artifactGraph: ArtifactGraph
|
|
thickness: Expr
|
|
}): Error | { modifiedAst: Node<Program>; pathToNode: PathToNode } {
|
|
const modifiedAst = structuredClone(node)
|
|
|
|
// Look up the corresponding extrude
|
|
const clonedAstForGetExtrude = structuredClone(modifiedAst)
|
|
|
|
const expressions: Expr[] = []
|
|
let pathToExtrudeNode: PathToNode | undefined = undefined
|
|
for (const graphSelection of selection.graphSelections) {
|
|
const extrudeLookupResult = getPathToExtrudeForSegmentSelection(
|
|
clonedAstForGetExtrude,
|
|
graphSelection,
|
|
artifactGraph
|
|
)
|
|
if (err(extrudeLookupResult)) {
|
|
return new Error("Couldn't find extrude")
|
|
}
|
|
|
|
// TODO: this assumes the segment is piped directly from the sketch, with no intermediate `VariableDeclarator` between.
|
|
// We must find a technique for these situations that is robust to intermediate declarations
|
|
const extrudeNode = getNodeFromPath<VariableDeclarator>(
|
|
modifiedAst,
|
|
extrudeLookupResult.pathToExtrudeNode,
|
|
'VariableDeclarator'
|
|
)
|
|
const segmentNode = getNodeFromPath<VariableDeclarator>(
|
|
modifiedAst,
|
|
extrudeLookupResult.pathToSegmentNode,
|
|
'VariableDeclarator'
|
|
)
|
|
if (err(extrudeNode) || err(segmentNode)) {
|
|
return new Error("Couldn't find extrude")
|
|
}
|
|
if (
|
|
extrudeNode.node.init.type === 'CallExpression' ||
|
|
extrudeNode.node.init.type === 'CallExpressionKw'
|
|
) {
|
|
pathToExtrudeNode = extrudeLookupResult.pathToExtrudeNode
|
|
} else if (segmentNode.node.init.type === 'PipeExpression') {
|
|
pathToExtrudeNode = extrudeLookupResult.pathToSegmentNode
|
|
} else {
|
|
return new Error("Couldn't find extrude")
|
|
}
|
|
|
|
const selectedArtifact = graphSelection.artifact
|
|
if (!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 if (selectedArtifact.type === 'wall') {
|
|
const tagResult = mutateAstWithTagForSketchSegment(
|
|
modifiedAst,
|
|
extrudeLookupResult.pathToSegmentNode
|
|
)
|
|
if (err(tagResult)) return tagResult
|
|
const { tag } = tagResult
|
|
expr = createIdentifier(tag)
|
|
} else {
|
|
continue
|
|
}
|
|
expressions.push(expr)
|
|
}
|
|
|
|
if (!pathToExtrudeNode) return new Error('No extrude found')
|
|
|
|
const extrudeNode = getNodeFromPath<VariableDeclarator>(
|
|
modifiedAst,
|
|
pathToExtrudeNode,
|
|
'VariableDeclarator'
|
|
)
|
|
if (err(extrudeNode)) {
|
|
return extrudeNode
|
|
}
|
|
|
|
const name = findUniqueName(node, KCL_DEFAULT_CONSTANT_PREFIXES.SHELL)
|
|
const shell = createCallExpressionStdLibKw(
|
|
'shell',
|
|
createIdentifier(extrudeNode.node.id.name),
|
|
[
|
|
createLabeledArg('faces', createArrayExpression(expressions)),
|
|
createLabeledArg('thickness', thickness),
|
|
]
|
|
)
|
|
const declaration = createVariableDeclaration(name, shell)
|
|
|
|
// 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'],
|
|
['declaration', 'VariableDeclaration'],
|
|
['init', 'VariableDeclarator'],
|
|
['unlabeled', 'CallExpressionKw'],
|
|
]
|
|
return {
|
|
modifiedAst,
|
|
pathToNode,
|
|
}
|
|
}
|