TkAstral3D/packages/sdk/lib/core/commands/SetSceneCommand.ts
2025-10-04 23:36:07 +08:00

86 lines
1.9 KiB
TypeScript

import {Scene} from "three";
import { Command } from './Command';
import { SetUuidCommand } from './SetUuidCommand';
import { SetValueCommand } from './SetValueCommand';
import { AddObjectCommand } from './AddObjectCommand';
import {useSignal} from "@/hooks";
import App from "../app/App";
const {setActive,dispatch} = useSignal();
/**
* @param scene containing children to import
* @constructor
*/
class SetSceneCommand extends Command {
private cmdArray: any[];
constructor(scene:Scene) {
super();
this.type = 'SetSceneCommand';
this.name = 'Set scene';
this.cmdArray = [];
if (scene !== undefined) {
this.cmdArray.push( new SetUuidCommand(App.scene, scene.uuid));
this.cmdArray.push( new SetValueCommand(App.scene, 'name', scene.name));
this.cmdArray.push( new SetValueCommand(App.scene, 'userData', JSON.parse(JSON.stringify(scene.userData))));
while ( scene.children.length > 0 ) {
const child = scene.children.pop();
this.cmdArray.push(new AddObjectCommand(child));
}
}
}
execute() {
setActive("sceneGraphChanged",false);
for (let i = 0; i < this.cmdArray.length; i++) {
this.cmdArray[i].execute();
}
setActive("sceneGraphChanged",true);
dispatch("sceneGraphChanged");
}
undo() {
setActive("sceneGraphChanged",false);
for (let i = this.cmdArray.length - 1; i >= 0; i--) {
this.cmdArray[i].undo();
}
setActive("sceneGraphChanged",true);
dispatch("sceneGraphChanged");
}
toJSON() {
const output = super.toJSON();
const cmds:string[] = [];
for ( let i = 0; i < this.cmdArray.length; i ++ ) {
cmds.push(this.cmdArray[ i ].toJSON());
}
output.cmds = cmds;
return output;
}
fromJSON(json) {
super.fromJSON( json );
const cmds = json.cmds;
for ( let i = 0; i < cmds.length; i ++ ) {
// @ts-ignore
const cmd = new window[cmds[i].type](); // 创建类型为“json.type”的新对象
cmd.fromJSON(cmds[i]);
this.cmdArray.push(cmd);
}
}
}
export { SetSceneCommand };