Bug fix: prevent KCL error due to colliding AST execution on project switch (#3205)

* Only run "Execute AST" action if defaultUnit setting changes

* A little more logging and catching anywhere we call video.play()
This commit is contained in:
Frank Noirot
2024-08-01 01:40:14 -04:00
committed by GitHub
parent 41b1ec94fa
commit 1ac39d95f2
5 changed files with 55 additions and 10 deletions

View File

@ -142,7 +142,9 @@ export const ModelingMachineProvider = ({
kclManager.executeCode().then(() => {
if (engineCommandManager.engineConnection?.idleMode) return
store.videoElement?.play()
store.videoElement?.play().catch((e) => {
console.warn('Video playing was prevented', e)
})
})
})()
},

View File

@ -175,11 +175,35 @@ export const SettingsAuthProviderBase = ({
id: `${event.type}.success`,
})
},
'Execute AST': () => {
'Execute AST': (context, event) => {
try {
const allSettingsIncludesUnitChange =
event.type === 'Set all settings' &&
event.settings?.modeling?.defaultUnit?.current !==
context.modeling.defaultUnit.current
const resetSettingsIncludesUnitChange =
event.type === 'Reset settings' &&
context.modeling.defaultUnit.current !==
settings?.modeling?.defaultUnit?.default
if (
event.type === 'set.modeling.defaultUnit' ||
allSettingsIncludesUnitChange ||
resetSettingsIncludesUnitChange
) {
kclManager.isFirstRender = true
kclManager.executeCode(true).then(() => {
kclManager.isFirstRender = false
})
} else {
// For any future logging we'd like to do
// console.log(
// 'Not re-executing AST because the settings change did not affect the code interpretation'
// )
}
} catch (e) {
console.error('Error executing AST after settings change', e)
}
},
},
services: {

View File

@ -156,7 +156,10 @@ export const Stream = () => {
useEffect(() => {
setIsFirstRender(kclManager.isFirstRender)
if (!kclManager.isFirstRender) videoRef.current?.play()
if (!kclManager.isFirstRender)
videoRef.current?.play().catch((e) => {
console.warn('Video playing was prevented', e)
})
setIsFreezeFrame(!kclManager.isFirstRender)
}, [kclManager.isFirstRender])
@ -170,8 +173,12 @@ export const Stream = () => {
if (!mediaStream) return
// Do not immediately play the stream!
try {
videoRef.current.srcObject = mediaStream
videoRef.current.pause()
} catch (e) {
console.warn('Attempted to pause stream while play was still loading', e)
}
send({
type: 'Set context',

View File

@ -224,6 +224,7 @@ export class KclManager {
sceneInfra.modelingSend({ type: 'code edit during sketch' })
defaultSelectionFilter(programMemory, this.engineCommandManager)
await this.engineCommandManager.waitForAllCommands()
if (zoomToFit) {
let zoomObjectId: string | undefined = ''
@ -243,6 +244,15 @@ export class KclManager {
padding: 0.1, // padding around the objects
},
})
await this.engineCommandManager.sendSceneCommand({
type: 'modeling_cmd_req',
cmd_id: uuidv4(),
cmd: {
type: 'zoom_to_fit',
object_ids: zoomObjectId ? [zoomObjectId] : [], // leave empty to zoom to all objects
padding: 0.1, // padding around the objects
},
})
}
this.isExecuting = false

View File

@ -1082,7 +1082,9 @@ export const modelingMachine = createMachine(
},
})
if (!engineCommandManager.engineConnection?.idleMode) {
store.videoElement?.play()
store.videoElement?.play().catch((e) => {
console.warn('Video playing was prevented', e)
})
}
if (updatedAst?.selections) {
editorManager.selectRange(updatedAst?.selections)