First pass at handling more than 2 sketches
This commit is contained in:
		@ -586,7 +586,10 @@ export const ModelingMachineProvider = ({
 | 
			
		||||
            return doesSceneHaveSweepableSketch(kclManager.ast)
 | 
			
		||||
          }
 | 
			
		||||
          // TODO: check if we need a check like this for loft
 | 
			
		||||
          console.log('isSketchPipe(selectionRanges)', isSketchPipe(selectionRanges))
 | 
			
		||||
          console.log(
 | 
			
		||||
            'isSketchPipe(selectionRanges)',
 | 
			
		||||
            isSketchPipe(selectionRanges)
 | 
			
		||||
          )
 | 
			
		||||
          // if (!isSketchPipe(selectionRanges)) return false
 | 
			
		||||
 | 
			
		||||
          const canLoft = canLoftSelection(selectionRanges)
 | 
			
		||||
 | 
			
		||||
@ -348,53 +348,46 @@ export function extrudeSketch(
 | 
			
		||||
 | 
			
		||||
export function loftSketches(
 | 
			
		||||
  node: Node<Program>,
 | 
			
		||||
  pathToNode0: PathToNode,
 | 
			
		||||
  pathToNode1: PathToNode,
 | 
			
		||||
  nodePaths: PathToNode[]
 | 
			
		||||
):
 | 
			
		||||
  | {
 | 
			
		||||
      modifiedAst: Node<Program>
 | 
			
		||||
      pathToNode: PathToNode
 | 
			
		||||
      pathToLoftArg: PathToNode
 | 
			
		||||
    }
 | 
			
		||||
  | Error {
 | 
			
		||||
  const _node = structuredClone(node)
 | 
			
		||||
 | 
			
		||||
  // TODO: make this whole thing list based
 | 
			
		||||
  const _node0 = getNodeFromPath<VariableDeclarator>(
 | 
			
		||||
    _node,
 | 
			
		||||
    pathToNode0,
 | 
			
		||||
    'VariableDeclarator'
 | 
			
		||||
  )
 | 
			
		||||
  const _node1 = getNodeFromPath<VariableDeclarator>(
 | 
			
		||||
    _node,
 | 
			
		||||
    pathToNode1,
 | 
			
		||||
    'VariableDeclarator'
 | 
			
		||||
  )
 | 
			
		||||
  if (err(_node0)) return _node0
 | 
			
		||||
  if (err(_node1)) return _node1
 | 
			
		||||
  const { node: variableDeclarator0, shallowPath: pathToDecleration0 } = _node0
 | 
			
		||||
  const { node: variableDeclarator1, shallowPath: pathToDecleration1 } = _node1
 | 
			
		||||
  const variableDeclarators = []
 | 
			
		||||
  const pathsToDeclarations = []
 | 
			
		||||
  for (const path of nodePaths) {
 | 
			
		||||
    const node = getNodeFromPath<VariableDeclarator>(
 | 
			
		||||
      _node,
 | 
			
		||||
      path,
 | 
			
		||||
      'VariableDeclarator'
 | 
			
		||||
    )
 | 
			
		||||
    if (err(node)) {
 | 
			
		||||
      return node
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  const identifiers = createArrayExpression([
 | 
			
		||||
    createIdentifier(variableDeclarator0.id.name),
 | 
			
		||||
    createIdentifier(variableDeclarator1.id.name),
 | 
			
		||||
  ])
 | 
			
		||||
  const loftCall = createCallExpressionStdLib('loft', [
 | 
			
		||||
    identifiers,
 | 
			
		||||
    // TODO: add others
 | 
			
		||||
  ])
 | 
			
		||||
    const { node: variableDeclarator, shallowPath: pathToDecleration } = node
 | 
			
		||||
    variableDeclarators.push(variableDeclarator)
 | 
			
		||||
    pathsToDeclarations.push(pathToDecleration)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const identifiers = createArrayExpression(
 | 
			
		||||
    variableDeclarators.map((d) => createIdentifier(d.id.name))
 | 
			
		||||
  )
 | 
			
		||||
  const loftCall = createCallExpressionStdLib('loft', [identifiers])
 | 
			
		||||
 | 
			
		||||
  // We're not creating a pipe expression,
 | 
			
		||||
  // but rather a separate constant for the extrusion
 | 
			
		||||
  const name = findUniqueName(node, KCL_DEFAULT_CONSTANT_PREFIXES.LOFT)
 | 
			
		||||
  const VariableDeclaration = createVariableDeclaration(name, loftCall)
 | 
			
		||||
 | 
			
		||||
  // TODO: check these blocks below for 0..n
 | 
			
		||||
  const sketchIndexInPathToNode =
 | 
			
		||||
    pathToDecleration1.findIndex((a) => a[0] === 'body') + 1
 | 
			
		||||
  const sketchIndexInBody = pathToDecleration1[
 | 
			
		||||
    sketchIndexInPathToNode
 | 
			
		||||
  ][0] as number
 | 
			
		||||
  // TODO: check which item lastPath should be here
 | 
			
		||||
  const lastPath = pathsToDeclarations[pathsToDeclarations.length - 1]
 | 
			
		||||
  const sketchIndexInPathToNode = lastPath.findIndex((a) => a[0] === 'body') + 1
 | 
			
		||||
  const sketchIndexInBody = lastPath[sketchIndexInPathToNode][0] as number
 | 
			
		||||
  _node.body.splice(sketchIndexInBody + 1, 0, VariableDeclaration)
 | 
			
		||||
 | 
			
		||||
  const pathToLoftArg: PathToNode = [
 | 
			
		||||
@ -408,7 +401,6 @@ export function loftSketches(
 | 
			
		||||
  ]
 | 
			
		||||
  return {
 | 
			
		||||
    modifiedAst: _node,
 | 
			
		||||
    pathToNode: [...pathToNode0.slice(0, -1), [-1, 'index']],
 | 
			
		||||
    pathToLoftArg,
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -570,7 +570,7 @@ export function canLoftSelection(selection: Selections) {
 | 
			
		||||
    // !!isSketchPipe(selection) &&
 | 
			
		||||
    commonNodes.length > 1 &&
 | 
			
		||||
    // commonNodes.every((n) => !hasSketchPipeBeenExtruded(n.selection, n.ast)) &&
 | 
			
		||||
    (commonNodes.every((n) => nodeHasClose(n) || nodeHasCircle(n))) &&
 | 
			
		||||
    commonNodes.every((n) => nodeHasClose(n) || nodeHasCircle(n)) &&
 | 
			
		||||
    commonNodes.every((n) => !nodeHasExtrude(n))
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -715,21 +715,12 @@ export const modelingMachine = setup({
 | 
			
		||||
        const { selection } = event.data
 | 
			
		||||
        let ast = kclManager.ast
 | 
			
		||||
        // TODO: make it all list based
 | 
			
		||||
        const pathToNode0 = getNodePathFromSourceRange(
 | 
			
		||||
          ast,
 | 
			
		||||
          selection.graphSelections[0]?.codeRef.range
 | 
			
		||||
        )
 | 
			
		||||
        const pathToNode1 = getNodePathFromSourceRange(
 | 
			
		||||
          ast,
 | 
			
		||||
          selection.graphSelections[1]?.codeRef.range
 | 
			
		||||
        )
 | 
			
		||||
        const loftSketchesRes = loftSketches(
 | 
			
		||||
          ast,
 | 
			
		||||
          pathToNode0,
 | 
			
		||||
          pathToNode1,
 | 
			
		||||
        const nodePaths = selection.graphSelections.map((s) =>
 | 
			
		||||
          getNodePathFromSourceRange(ast, s?.codeRef.range)
 | 
			
		||||
        )
 | 
			
		||||
        const loftSketchesRes = loftSketches(ast, nodePaths)
 | 
			
		||||
        if (trap(loftSketchesRes)) return
 | 
			
		||||
        const { modifiedAst, pathToLoftArg } = loftSketchesRes 
 | 
			
		||||
        const { modifiedAst, pathToLoftArg } = loftSketchesRes
 | 
			
		||||
 | 
			
		||||
        const updatedAst = await kclManager.updateAst(modifiedAst, true, {
 | 
			
		||||
          focusPath: [pathToLoftArg],
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user