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 { 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("保存项目失败"); } } }