Add dry-run validation for Sweep

Fixes #5095
This commit is contained in:
Pierre Jacquier
2025-01-17 12:02:50 -05:00
parent 0592d3b5da
commit ffb2559787
3 changed files with 67 additions and 12 deletions

View File

@ -985,15 +985,9 @@ sketch002 = startSketchOn('XZ')
stage: 'arguments',
})
await clickOnSketch2()
await cmdBar.expectState({
commandName: 'Sweep',
headerArguments: {
Path: '1 face',
Profile: '1 face',
},
stage: 'review',
})
await page.waitForTimeout(500)
await cmdBar.progressCmdBar()
await page.waitForTimeout(500)
})
await test.step(`Confirm code is added to the editor, scene has changed`, async () => {

View File

@ -13,6 +13,7 @@ import {
loftValidator,
revolveAxisValidator,
shellValidator,
sweepValidator,
} from './validators'
type OutputFormat = Models['OutputFormat_type']
@ -308,7 +309,7 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig<
'Create a 3D body by moving a sketch region along an arbitrary path.',
icon: 'sweep',
status: 'development',
needsReview: true,
needsReview: false,
args: {
profile: {
inputType: 'selection',
@ -316,7 +317,6 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig<
required: true,
skip: true,
multiple: false,
// TODO: add dry-run validation
warningMessage:
'The sweep workflow is new and under tested. Please break it and report issues.',
},
@ -324,9 +324,9 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig<
inputType: 'selection',
selectionTypes: ['segment', 'path'],
required: true,
skip: true,
skip: false,
multiple: false,
// TODO: add dry-run validation
validation: sweepValidator,
},
},
},

View File

@ -207,3 +207,64 @@ export const shellValidator = async ({
return 'Unable to shell with the provided selection'
}
export const sweepValidator = async ({
context,
data,
}: {
context: CommandBarContext
data: { path: Selections }
}): Promise<boolean | string> => {
if (!isSelections(data.path)) {
console.log('Unable to sweep, selections are missing')
return 'Unable to sweep, selections are missing'
}
// Retrieve the parent path from the segment selection directly
const trajectoryArtifact = data.path.graphSelections[0].artifact
if (!trajectoryArtifact) {
return "Unable to sweep, couldn't find the trajectory artifact"
}
if (trajectoryArtifact.type !== 'segment') {
return "Unable to sweep, couldn't find the target from a non-segment selection"
}
const trajectory = trajectoryArtifact.pathId
// Get the former arg in the command bar flow, and retrieve the path from the solid2d directly
const profileArg = context.argumentsToSubmit['profile'] as Selections
const profileArtifact = profileArg.graphSelections[0].artifact
if (!profileArtifact) {
return "Unable to sweep, couldn't find the profile artifact"
}
if (profileArtifact.type !== 'solid2D') {
return "Unable to sweep, couldn't find the target from a non-solid2d selection"
}
const target = profileArtifact.pathId
const sweepCommand = async () => {
// TODO: second look on defaults here
const DEFAULT_TOLERANCE: Models['LengthUnit_type'] = 1e-7
const DEFAULT_SECTIONAL = false
const cmdArgs = {
target,
trajectory,
sectional: DEFAULT_SECTIONAL,
tolerance: DEFAULT_TOLERANCE,
}
return await engineCommandManager.sendSceneCommand({
type: 'modeling_cmd_req',
cmd_id: uuidv4(),
cmd: {
type: 'sweep',
...cmdArgs,
},
})
}
const attemptSweep = await dryRunWrapper(sweepCommand)
if (attemptSweep?.success) {
return true
}
return 'Unable to sweep with the provided selection'
}