Add support for deleting sketches on caps (not walls)
This commit is contained in:
@ -60,7 +60,14 @@ import { Models } from '@kittycad/lib'
|
|||||||
import { ExtrudeFacePlane } from 'machines/modelingMachine'
|
import { ExtrudeFacePlane } from 'machines/modelingMachine'
|
||||||
import { Node } from 'wasm-lib/kcl/bindings/Node'
|
import { Node } from 'wasm-lib/kcl/bindings/Node'
|
||||||
import { KclExpressionWithVariable } from 'lib/commandTypes'
|
import { KclExpressionWithVariable } from 'lib/commandTypes'
|
||||||
import { Artifact, expandPath, expandPlane, getPathsFromArtifact } from './std/artifactGraph'
|
import {
|
||||||
|
Artifact,
|
||||||
|
expandCap,
|
||||||
|
expandPath,
|
||||||
|
expandPlane,
|
||||||
|
getPathsFromArtifact,
|
||||||
|
getPlaneFromArtifact,
|
||||||
|
} from './std/artifactGraph'
|
||||||
import { BodyItem } from 'wasm-lib/kcl/bindings/BodyItem'
|
import { BodyItem } from 'wasm-lib/kcl/bindings/BodyItem'
|
||||||
import { findKwArg } from './util'
|
import { findKwArg } from './util'
|
||||||
import { deleteEdgeTreatment } from './modifyAst/addEdgeTreatment'
|
import { deleteEdgeTreatment } from './modifyAst/addEdgeTreatment'
|
||||||
@ -1386,10 +1393,19 @@ export async function deleteFromSelection(
|
|||||||
): Promise<Node<Program> | Error> {
|
): Promise<Node<Program> | Error> {
|
||||||
const astClone = structuredClone(ast)
|
const astClone = structuredClone(ast)
|
||||||
console.log('deleting', selection, variables)
|
console.log('deleting', selection, variables)
|
||||||
if (selection.artifact?.type === 'plane' && selection.artifact.pathIds.length) {
|
if (
|
||||||
const plane = expandPlane(selection.artifact, engineCommandManager.artifactGraph)
|
(selection.artifact?.type === 'plane' ||
|
||||||
|
selection.artifact?.type === 'cap') &&
|
||||||
|
selection.artifact.pathIds.length
|
||||||
|
) {
|
||||||
|
const plane =
|
||||||
|
selection.artifact.type === 'plane'
|
||||||
|
? expandPlane(selection.artifact, engineCommandManager.artifactGraph)
|
||||||
|
: expandCap(selection.artifact, engineCommandManager.artifactGraph)
|
||||||
console.log('plane expanded', plane)
|
console.log('plane expanded', plane)
|
||||||
for (const path of plane.paths.sort((a, b) => b.codeRef.range[0] - a.codeRef.range[0])) {
|
for (const path of plane.paths.sort(
|
||||||
|
(a, b) => b.codeRef.range[0] - a.codeRef.range[0]
|
||||||
|
)) {
|
||||||
const varDec = getNodeFromPath<VariableDeclarator>(
|
const varDec = getNodeFromPath<VariableDeclarator>(
|
||||||
ast,
|
ast,
|
||||||
path.codeRef.pathToNode,
|
path.codeRef.pathToNode,
|
||||||
@ -1399,6 +1415,11 @@ export async function deleteFromSelection(
|
|||||||
const bodyIndex = Number(varDec.shallowPath[1][0])
|
const bodyIndex = Number(varDec.shallowPath[1][0])
|
||||||
astClone.body.splice(bodyIndex, 1)
|
astClone.body.splice(bodyIndex, 1)
|
||||||
}
|
}
|
||||||
|
// If it's a cap, we're not going to continue and try to
|
||||||
|
// delete the extrusion
|
||||||
|
if (selection.artifact.type === 'cap') {
|
||||||
|
return astClone
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const varDec = getNodeFromPath<VariableDeclarator>(
|
const varDec = getNodeFromPath<VariableDeclarator>(
|
||||||
ast,
|
ast,
|
||||||
|
|||||||
@ -20,6 +20,7 @@ import { Models } from '@kittycad/lib'
|
|||||||
import { getNodePathFromSourceRange } from 'lang/queryAstNodePathUtils'
|
import { getNodePathFromSourceRange } from 'lang/queryAstNodePathUtils'
|
||||||
import { err } from 'lib/trap'
|
import { err } from 'lib/trap'
|
||||||
import { Cap, Plane, Wall } from 'wasm-lib/kcl/bindings/Artifact'
|
import { Cap, Plane, Wall } from 'wasm-lib/kcl/bindings/Artifact'
|
||||||
|
import { CapSubType } from 'wasm-lib/kcl/bindings/Artifact'
|
||||||
|
|
||||||
export type { Artifact, ArtifactId, SegmentArtifact } from 'lang/wasm'
|
export type { Artifact, ArtifactId, SegmentArtifact } from 'lang/wasm'
|
||||||
|
|
||||||
@ -38,6 +39,15 @@ export interface PlaneArtifactRich extends BaseArtifact {
|
|||||||
codeRef: CodeRef
|
codeRef: CodeRef
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface CapArtifactRich extends BaseArtifact {
|
||||||
|
type: 'cap'
|
||||||
|
subType: CapSubType
|
||||||
|
faceCodeRef: CodeRef
|
||||||
|
edgeCuts: Array<EdgeCut>
|
||||||
|
paths: Array<PathArtifact>
|
||||||
|
sweep?: SweepArtifact
|
||||||
|
}
|
||||||
|
|
||||||
export interface PathArtifactRich extends BaseArtifact {
|
export interface PathArtifactRich extends BaseArtifact {
|
||||||
type: 'path'
|
type: 'path'
|
||||||
/** A path must always lie on a plane */
|
/** A path must always lie on a plane */
|
||||||
@ -152,6 +162,41 @@ export function expandPlane(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function expandCap(
|
||||||
|
cap: CapArtifact,
|
||||||
|
artifactGraph: ArtifactGraph
|
||||||
|
): CapArtifactRich {
|
||||||
|
const { pathIds, sweepId: _s, edgeCutEdgeIds, ...keptProperties } = cap
|
||||||
|
const paths = pathIds?.length
|
||||||
|
? Array.from(
|
||||||
|
getArtifactsOfTypes(
|
||||||
|
{ keys: cap.pathIds, types: ['path'] },
|
||||||
|
artifactGraph
|
||||||
|
).values()
|
||||||
|
)
|
||||||
|
: []
|
||||||
|
const maybeSweep = getArtifactOfTypes(
|
||||||
|
{ key: cap.sweepId, types: ['sweep'] },
|
||||||
|
artifactGraph
|
||||||
|
)
|
||||||
|
const sweep = err(maybeSweep) ? undefined : maybeSweep
|
||||||
|
const edgeCuts = edgeCutEdgeIds?.length
|
||||||
|
? Array.from(
|
||||||
|
getArtifactsOfTypes(
|
||||||
|
{ keys: cap.edgeCutEdgeIds, types: ['edgeCut'] },
|
||||||
|
artifactGraph
|
||||||
|
).values()
|
||||||
|
)
|
||||||
|
: []
|
||||||
|
return {
|
||||||
|
type: 'cap',
|
||||||
|
...keptProperties,
|
||||||
|
paths,
|
||||||
|
sweep,
|
||||||
|
edgeCuts,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function expandPath(
|
export function expandPath(
|
||||||
path: PathArtifact,
|
path: PathArtifact,
|
||||||
artifactGraph: ArtifactGraph
|
artifactGraph: ArtifactGraph
|
||||||
|
|||||||
@ -80,10 +80,11 @@ export function isCursorInSketchCommandRange(
|
|||||||
const parentId =
|
const parentId =
|
||||||
firstEntry?.type === 'segment'
|
firstEntry?.type === 'segment'
|
||||||
? firstEntry.pathId
|
? firstEntry.pathId
|
||||||
: (firstEntry?.type === 'plane' ||
|
: ((firstEntry?.type === 'plane' ||
|
||||||
firstEntry?.type === 'cap' ||
|
firstEntry?.type === 'cap' ||
|
||||||
firstEntry?.type === 'wall') &&
|
firstEntry?.type === 'wall') &&
|
||||||
firstEntry.pathIds.length
|
firstEntry.pathIds?.length) ||
|
||||||
|
false
|
||||||
? firstEntry.pathIds[0]
|
? firstEntry.pathIds[0]
|
||||||
: false
|
: false
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user