Nadro/2608/sketch mode scene state improvements (#3866)
* bug: fixing multiple state issues with the engine and modeling app to enable/disable planes/axis/delete code * fix: yarn tsc fmt lint xgen * fix: adding a comment back that I deleted on accident * fix: adding formatting back? * fix: reverting syntax * fix: removing click line tool because the line tool is automatically selected. Clicking this will exit * fix: Fixed a E2E test that had a line tool workflow with no points --------- Co-authored-by: Frank Noirot <frank@zoo.dev> Co-authored-by: 49fl <ircsurfer33@gmail.com>
This commit is contained in:
@ -521,7 +521,6 @@ test(
|
|||||||
const startXPx = 600
|
const startXPx = 600
|
||||||
|
|
||||||
// Equip the rectangle tool
|
// Equip the rectangle tool
|
||||||
await page.getByRole('button', { name: 'line Line', exact: true }).click()
|
|
||||||
await page
|
await page
|
||||||
.getByRole('button', { name: 'rectangle Corner rectangle', exact: true })
|
.getByRole('button', { name: 'rectangle Corner rectangle', exact: true })
|
||||||
.click()
|
.click()
|
||||||
|
@ -1208,6 +1208,12 @@ extrude001 = extrude(50, sketch001)
|
|||||||
test('Deselecting line tool should mean nothing happens on click', async ({
|
test('Deselecting line tool should mean nothing happens on click', async ({
|
||||||
page,
|
page,
|
||||||
}) => {
|
}) => {
|
||||||
|
/**
|
||||||
|
* If the line tool is clicked when the state is 'No Points' it will exit Sketch mode.
|
||||||
|
* This is the same exact workflow as pressing ESC.
|
||||||
|
*
|
||||||
|
* To continue to test this workflow, we now enter sketch mode and place a single point before exiting the line tool.
|
||||||
|
*/
|
||||||
const u = await getUtils(page)
|
const u = await getUtils(page)
|
||||||
await page.setViewportSize({ width: 1200, height: 500 })
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
|
|
||||||
@ -1228,6 +1234,7 @@ extrude001 = extrude(50, sketch001)
|
|||||||
200
|
200
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Clicks the XZ Plane in the page
|
||||||
await page.mouse.click(700, 200)
|
await page.mouse.click(700, 200)
|
||||||
|
|
||||||
await expect(page.locator('.cm-content')).toHaveText(
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
@ -1236,6 +1243,11 @@ extrude001 = extrude(50, sketch001)
|
|||||||
|
|
||||||
await page.waitForTimeout(600)
|
await page.waitForTimeout(600)
|
||||||
|
|
||||||
|
// Place a point because the line tool will exit if no points are pressed
|
||||||
|
await page.mouse.click(650, 200)
|
||||||
|
await page.waitForTimeout(600)
|
||||||
|
|
||||||
|
// Code before exiting the tool
|
||||||
let previousCodeContent = await page.locator('.cm-content').innerText()
|
let previousCodeContent = await page.locator('.cm-content').innerText()
|
||||||
|
|
||||||
// deselect the line tool by clicking it
|
// deselect the line tool by clicking it
|
||||||
|
@ -149,6 +149,13 @@ export const ModelingMachineProvider = ({
|
|||||||
},
|
},
|
||||||
'sketch exit execute': ({ context: { store } }) => {
|
'sketch exit execute': ({ context: { store } }) => {
|
||||||
;(async () => {
|
;(async () => {
|
||||||
|
// When cancelling the sketch mode we should disable sketch mode within the engine.
|
||||||
|
await engineCommandManager.sendSceneCommand({
|
||||||
|
type: 'modeling_cmd_req',
|
||||||
|
cmd_id: uuidv4(),
|
||||||
|
cmd: { type: 'sketch_mode_disable' },
|
||||||
|
})
|
||||||
|
|
||||||
sceneInfra.camControls.syncDirection = 'clientToEngine'
|
sceneInfra.camControls.syncDirection = 'clientToEngine'
|
||||||
|
|
||||||
if (cameraProjection.current === 'perspective') {
|
if (cameraProjection.current === 'perspective') {
|
||||||
|
@ -295,6 +295,12 @@ export class KclManager {
|
|||||||
this._cancelTokens.delete(currentExecutionId)
|
this._cancelTokens.delete(currentExecutionId)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Exit sketch mode if the AST is empty
|
||||||
|
if (this._isAstEmpty(ast)) {
|
||||||
|
await this.disableSketchMode()
|
||||||
|
}
|
||||||
|
|
||||||
this.logs = logs
|
this.logs = logs
|
||||||
// Do not add the errors since the program was interrupted and the error is not a real KCL error
|
// Do not add the errors since the program was interrupted and the error is not a real KCL error
|
||||||
this.addKclErrors(isInterrupted ? [] : errors)
|
this.addKclErrors(isInterrupted ? [] : errors)
|
||||||
@ -553,6 +559,24 @@ export class KclManager {
|
|||||||
defaultSelectionFilter() {
|
defaultSelectionFilter() {
|
||||||
defaultSelectionFilter(this.programMemory, this.engineCommandManager)
|
defaultSelectionFilter(this.programMemory, this.engineCommandManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We can send a single command of 'enable_sketch_mode' or send this in a batched request.
|
||||||
|
* When there is no code in the KCL editor we should be sending 'sketch_mode_disable' since any previous half finished
|
||||||
|
* code could leave the state of the application in sketch mode on the engine side.
|
||||||
|
*/
|
||||||
|
async disableSketchMode() {
|
||||||
|
await this.engineCommandManager.sendSceneCommand({
|
||||||
|
type: 'modeling_cmd_req',
|
||||||
|
cmd_id: uuidv4(),
|
||||||
|
cmd: { type: 'sketch_mode_disable' },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determines if there is no KCL code which means it is executing a blank KCL file
|
||||||
|
_isAstEmpty(ast: Program) {
|
||||||
|
return ast.start === 0 && ast.end === 0 && ast.body.length === 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function defaultSelectionFilter(
|
function defaultSelectionFilter(
|
||||||
|
@ -295,7 +295,14 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
|||||||
'break',
|
'break',
|
||||||
{
|
{
|
||||||
id: 'line',
|
id: 'line',
|
||||||
onClick: ({ modelingState, modelingSend }) =>
|
onClick: ({ modelingState, modelingSend }) => {
|
||||||
|
if (modelingState.matches({ Sketch: { 'Line tool': 'No Points' } })) {
|
||||||
|
// Exit the sketch state if there are no points and they press ESC
|
||||||
|
modelingSend({
|
||||||
|
type: 'Cancel',
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// Exit the tool if there are points and they press ESC
|
||||||
modelingSend({
|
modelingSend({
|
||||||
type: 'change tool',
|
type: 'change tool',
|
||||||
data: {
|
data: {
|
||||||
@ -303,7 +310,9 @@ export const toolbarConfig: Record<ToolbarModeName, ToolbarMode> = {
|
|||||||
? 'line'
|
? 'line'
|
||||||
: 'none',
|
: 'none',
|
||||||
},
|
},
|
||||||
}),
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
icon: 'line',
|
icon: 'line',
|
||||||
status: 'available',
|
status: 'available',
|
||||||
disabled: (state) =>
|
disabled: (state) =>
|
||||||
|
Reference in New Issue
Block a user