选择文件使用回调而不是Promise

pull/496/MERGE
ChenX 5 years ago
parent d262acf1d3
commit 9357ab5b12

@ -2,19 +2,23 @@ import DxfParser from "dxf-parser";
import { app } from "../ApplicationServices/Application"; import { app } from "../ApplicationServices/Application";
import { arrayLast } from "../Common/ArrayExt"; import { arrayLast } from "../Common/ArrayExt";
import { FileSystem } from "../Common/FileSystem"; import { FileSystem } from "../Common/FileSystem";
import { Arc } from "../DatabaseServices/Entity/Arc";
import { Circle } from "../DatabaseServices/Entity/Circle";
import { Line } from "../DatabaseServices/Entity/Line";
import { Polyline } from "../DatabaseServices/Entity/Polyline"; import { Polyline } from "../DatabaseServices/Entity/Polyline";
import { CommandWrap } from "../Editor/CommandMachine";
import { AsVector2, AsVector3 } from "../Geometry/GeUtils"; import { AsVector2, AsVector3 } from "../Geometry/GeUtils";
import { Line } from "../DatabaseServices/Entity/Line";
import { Circle } from "../DatabaseServices/Entity/Circle";
import { Arc } from "../DatabaseServices/Entity/Arc";
export class Command_DXFImport export class Command_DXFImport
{ {
async exec() async exec()
{ {
let files = await FileSystem.ChooseFile(".dxf"); FileSystem.ChooseFile({
if (!files) return; filter: ".dxf",
callback: (files) =>
{
CommandWrap(async () =>
{
for (let i = 0; i < files.length; i++) for (let i = 0; i < files.length; i++)
{ {
let f = files.item(i); let f = files.item(i);
@ -60,5 +64,8 @@ export class Command_DXFImport
} }
} }
} }
}, "dxf插入");
}
});
} }
} }

@ -8,7 +8,7 @@ import { Board, BoardType } from "../DatabaseServices/Entity/Board";
import { ExtrudeSolid } from "../DatabaseServices/Entity/Extrude"; import { ExtrudeSolid } from "../DatabaseServices/Entity/Extrude";
import { Polyline, PolylineProps } from "../DatabaseServices/Entity/Polyline"; import { Polyline, PolylineProps } from "../DatabaseServices/Entity/Polyline";
import { TemplateRecord } from "../DatabaseServices/Template/TemplateRecord"; import { TemplateRecord } from "../DatabaseServices/Template/TemplateRecord";
import { Command } from "../Editor/CommandMachine"; import { Command, CommandWrap } from "../Editor/CommandMachine";
import { Vec2 } from "../Geometry/CheckIntersect"; import { Vec2 } from "../Geometry/CheckIntersect";
import { AsVector2, equaln } from "../Geometry/GeUtils"; import { AsVector2, equaln } from "../Geometry/GeUtils";
import { Vec3 } from "../Geometry/IVec3"; import { Vec3 } from "../Geometry/IVec3";
@ -105,10 +105,12 @@ export class Command_KJLImport implements Command
{ {
async exec() async exec()
{ {
let flist = await FileSystem.ChooseFile(".json", false); FileSystem.ChooseFile({
if (flist.length > 0) filter: ".json", multiple: false, callback: (files) =>
{ {
let f = flist.item(0); CommandWrap(async () =>
{
let f = files.item(0);
let fstr = await FileSystem.ReadFileAsText(f); let fstr = await FileSystem.ReadFileAsText(f);
let fileData = JSON.parse(fstr) as KJL_JsonFile; let fileData = JSON.parse(fstr) as KJL_JsonFile;
let roomMap = ParseRoomNameMap(fileData.designData); let roomMap = ParseRoomNameMap(fileData.designData);
@ -126,7 +128,9 @@ export class Command_KJLImport implements Command
let ok = await JigMoveEntity(ens); let ok = await JigMoveEntity(ens);
return !ok; return !ok;
}, "酷家乐导入");
} }
});
} }
} }

@ -23,8 +23,8 @@ export class UpLoadConfig implements Command
{ {
async exec() async exec()
{ {
let files = await FileSystem.ChooseFile(".json"); FileSystem.ChooseFile({
if (files.length === 1) filter: ".json", callback: async (files) =>
{ {
let f = files[0]; let f = files[0];
let fileData = JSON.parse(await FileSystem.ReadFileAsText(f)); let fileData = JSON.parse(await FileSystem.ReadFileAsText(f));
@ -37,10 +37,11 @@ export class UpLoadConfig implements Command
await PostJson(ConfigUrls.Edit, { key: i, value: JSON.stringify(configs) }); await PostJson(ConfigUrls.Edit, { key: i, value: JSON.stringify(configs) });
} }
} }
}
AppToaster.show({ AppToaster.show({
message: "上传完成", message: "上传完成",
timeout: 1000, timeout: 1000,
}); });
} }
});
}
} }

@ -2,15 +2,18 @@ import { LoadingManager, Mesh, MeshNormalMaterial } from "three";
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader"; import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader";
import { app } from "../ApplicationServices/Application"; import { app } from "../ApplicationServices/Application";
import { FileSystem } from "../Common/FileSystem"; import { FileSystem } from "../Common/FileSystem";
import { Command } from "../Editor/CommandMachine"; import { Command, CommandWrap } from "../Editor/CommandMachine";
import { GetBox, MoveMatrix } from "../Geometry/GeUtils"; import { GetBox, MoveMatrix } from "../Geometry/GeUtils";
export class Fbx implements Command export class Fbx implements Command
{ {
async exec() async exec()
{ {
let files = await FileSystem.ChooseFile(".fbx"); FileSystem.ChooseFile({
filter: ".fbx", callback: async (files) =>
{
CommandWrap(() =>
{
let m = new MeshNormalMaterial(); let m = new MeshNormalMaterial();
for (let i = 0; i < files.length; i++) for (let i = 0; i < files.length; i++)
@ -44,5 +47,8 @@ export class Fbx implements Command
// Read in the image file as a data URL. // Read in the image file as a data URL.
reader.readAsArrayBuffer(f); reader.readAsArrayBuffer(f);
} }
}, "fbx");
}
});
} }
} }

@ -352,46 +352,29 @@ export class FileSystem
} }
}; };
static chooserInput: HTMLInputElement;
/** /**
* *
*/ */
static ChooseFile(filter?: string, multiple = false): Promise<FileList> static ChooseFile({ filter, multiple = false, callback }: { filter?: string; multiple?: boolean; callback: (filelist: FileList) => void; })
{ {
return new Promise((res, rej) => if (!this.chooserInput)
{ {
let _returned = false; this.chooserInput = document.createElement("input");
let _return = async () => this.chooserInput.type = "file";
{ this.chooserInput.style.display = "none";
if (_returned) return; document.body.appendChild(this.chooserInput);
_returned = true;
for (let i = 0; i < 10; i++)
{
if (chooser.files.length > 0) break;
await Sleep(100);
}
res(chooser.files);
document.body.removeChild(chooser);
document.body.onfocus = oldCallback;
} }
let oldCallback = document.body.onfocus; this.chooserInput.accept = filter;
document.body.onfocus = _return; this.chooserInput.onchange = () =>
{
let chooser = document.createElement("input"); if (this.chooserInput.files.length > 0)
chooser.type = "file"; callback(this.chooserInput.files);
chooser.style.display = "none";
document.body.appendChild(chooser);
chooser.accept = filter;
chooser.onchange = _return;
chooser.multiple = multiple;
chooser.click();
});
}; };
this.chooserInput.multiple = multiple;
this.chooserInput.click();
}
/** /**
* Used as an alternative to chooseFile for saving files in the browser. * Used as an alternative to chooseFile for saving files in the browser.

Loading…
Cancel
Save