123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- import { Events } from "queenjs";
- import { useCtx } from "../../ctx";
- import { Controller } from "../../core/controller";
- import { PackSource } from "../../objects/packSource";
- import { EditorCtrl } from "./editor";
- import {
- PackScene,
- PackGeom,
- PackProduct,
- PackSceneProduct,
- } from "@/comm/objects/pack";
- import { compMap } from "./tempComp";
- async function createDefaultSpu3dConf() {
- const currTime = new Date().toISOString();
- const source = new PackSource();
- source.state.scenes = [new PackScene()];
- // 初始化模型资产
- const geom = new PackGeom();
- geom.file = { url: "assets/box.fbx", size: 0 };
- const product = new PackProduct();
- product.geomId = geom.id;
- const sceneProd = new PackSceneProduct();
- sceneProd.state.prodId = product.id;
- const currScene = source.scenes[0];
- // currScene.envId = env.id;
- source.geoms.push(geom);
- source.products.push(product);
- // source.env3ds.push(env);
- currScene.products.push(sceneProd);
- const defaultData = {
- name: "",
- source: source.toJson(),
- createTime: currTime,
- updateTime: currTime,
- };
- return defaultData;
- }
- export class ProjectController extends Controller {
- RootDir = "";
- DataDir = "";
- HostURL = "";
- _swiftLocal = true;
- _editor?: EditorCtrl;
- _spu3dFile: any;
- get editor() {
- return this._editor as EditorCtrl;
- }
- async onReady() {
- const params = new URLSearchParams(location.search);
- const projectPath = params.get("path") as string;
- this.RootDir = projectPath;
- const deviceCtrl = useCtx().deviceCtrl;
- deviceCtrl.GetAppDataDir().then((dir: any) => {
- this.DataDir = dir;
- });
- if (!projectPath) {
- deviceCtrl.SetMainTitle("spu3d");
- return;
- }
- deviceCtrl.SetMainTitle("项目:" + projectPath);
- this.HostURL = await deviceCtrl.StartHttpServer(this.RootDir);
- console.log("host url=>", this.HostURL);
- await this.loadProject();
- }
- async save() {
- const detail = this._spu3dFile;
- detail.source = this.editor.pack.toJson();
- detail.updateTime = new Date().toISOString();
- const deviceCtrl = useCtx().deviceCtrl;
- const ok = await deviceCtrl.WriteFileText(
- `${this.RootDir}/project.spu3d`,
- JSON.stringify(detail)
- );
- if (!ok) {
- return Promise.reject("保存项目失败");
- }
- }
- async loadProject() {
- const deviceCtrl = useCtx().deviceCtrl;
- try {
- const { text } = await deviceCtrl.ReadFileText(
- `${this.RootDir}/project.spu3d`
- );
- const project = JSON.parse(text);
- this._spu3dFile = project;
- const pack = new PackSource();
- pack.fromJson(project.source);
- console.log("=================>", pack);
- this._editor = new EditorCtrl(pack);
- } catch (error) {
- alert("项目加载失败" + error);
- }
- }
- async loadQueen5() {
- const deviceCtrl = useCtx().deviceCtrl;
- try {
- const { text } = await deviceCtrl.ReadFileText(
- `${this.RootDir}/project.queen5`
- );
- let data = {} as any;
- if (!text) {
- data = { categories: ["64e4281a12c676099617ffc6"], title: "pc" };
- } else {
- data = JSON.parse(text);
- }
- return data;
- } catch (error) {
- alert("项目加载失败" + error);
- }
- }
- async getProjectDetail(
- dir: string
- ): ReturnType<typeof createDefaultSpu3dConf> {
- const deviceCtrl = useCtx().deviceCtrl;
- const ret = await deviceCtrl.ReadFileText(`${dir}/project.spu3d`);
- if (ret.text) {
- const info = JSON.parse(ret.text);
- return info;
- } else {
- //项目可能已经删除或数据错误了
- return Promise.reject("获取项目详情失败");
- }
- }
- getOutputDir() {
- return this.RootDir + "/" + "outputs";
- }
- getAppDataDir() {
- return this.DataDir;
- }
- getDefaultLogo() {
- return this.DataDir + "/static/thumbnail.png";
- }
- createPath(fpath: string) {
- return this.RootDir + "/" + fpath;
- }
- getSwiftUri(assetPath: string) {
- if (this._swiftLocal) return this.getLocalAbsoluteUri(assetPath);
- return this.getHttpAbsoluteUri(assetPath);
- }
- getHttpAbsoluteUri(url: string) {
- if (url.substring(0, 2) == "//") return "http://" + url;
- if (url.substring(0, 4) == "http") return url;
- if (url.charAt(0) == "/") return this.HostURL + url.substring(1);
- return this.HostURL + url;
- }
- getLocalAbsoluteUri(url: string) {
- if (url.substring(0, 2) == "//") return "http://" + url;
- if (url.substring(0, 4) == "http") return url;
- if (url.charAt(0) == "/") return this.RootDir + url;
- return this.RootDir + "/" + url;
- }
- getRelativeUri(url: string) {
- let s = this.HostURL.length;
- let pre = url.substring(0, s);
- if (pre == this.HostURL) return url.substring(s + 1);
- s = this.RootDir.length;
- pre = url.substring(0, s);
- if (pre == this.RootDir) return url.substring(s + 1);
- return "";
- }
- async createProject(path: string) {
- const deviceCtrl = useCtx().deviceCtrl;
- const filePath = `${path}/project.spu3d`;
- const isFileExit = await deviceCtrl.IsFileExit(filePath);
- if (isFileExit) {
- return Promise.reject("该项目已存在");
- }
- const name = path.split("/").pop() || "";
- const defSpu3dConf = await createDefaultSpu3dConf();
- defSpu3dConf.name = name;
- const appDir = await deviceCtrl.GetAppDataDir();
- await deviceCtrl.CopyFile(
- `${appDir}/static/default.png`,
- `${path}/assets/thumbnail.png`
- );
- await deviceCtrl.CopyFile(
- `${appDir}/static/box.fbx`,
- `${path}/assets/box.fbx`
- );
- await deviceCtrl.WriteFileText(filePath, JSON.stringify(defSpu3dConf));
- return filePath;
- }
- async pickProject() {
- const deviceCtrl = useCtx().deviceCtrl;
- const projectDir = await deviceCtrl.SelectDir();
- if (await this.isProjectExit(projectDir)) {
- return projectDir;
- } else {
- return Promise.reject();
- }
- }
- async isProjectExit(dir: string) {
- const deviceCtrl = useCtx().deviceCtrl;
- return await deviceCtrl.IsFileExit(`${dir}/project.spu3d`);
- }
- async saveProjectSource() {
- const detail = await this.getProjectDetail(this.RootDir);
- detail.source = this.editor.pack.toJson();
- detail.updateTime = new Date().toISOString();
- const deviceCtrl = useCtx().deviceCtrl;
- const ok = await deviceCtrl.WriteFileText(
- `${this.RootDir}/project.spu3d`,
- JSON.stringify(detail)
- );
- if (!ok) {
- return Promise.reject("保存项目失败");
- }
- }
- }
|