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

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

@ -2,63 +2,70 @@ import DxfParser from "dxf-parser";
import { app } from "../ApplicationServices/Application";
import { arrayLast } from "../Common/ArrayExt";
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 { CommandWrap } from "../Editor/CommandMachine";
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
{
async exec()
{
let files = await FileSystem.ChooseFile(".dxf");
if (!files) return;
for (let i = 0; i < files.length; i++)
{
let f = files.item(i);
let ext = arrayLast(f.name.split("."));
if (ext.toUpperCase() === "DXF")
FileSystem.ChooseFile({
filter: ".dxf",
callback: (files) =>
{
let parser = new DxfParser();
let str = await FileSystem.ReadFileAsText(f);
let dxfDocument = parser.parseSync(str);
for (let en of dxfDocument.entities)
CommandWrap(async () =>
{
if (en.type === "LWPOLYLINE")
for (let i = 0; i < files.length; i++)
{
let pl = new Polyline();
pl.LineData = en.vertices.map(p =>
let f = files.item(i);
let ext = arrayLast(f.name.split("."));
if (ext.toUpperCase() === "DXF")
{
return {
pt: AsVector2(p),
bul: p.bulge ? p.bulge : 0
};
});
pl.CloseMark = en.shape;
app.Database.ModelSpace.Append(pl);
}
else if (en.type === "ARC")
{
let arc = new Arc(AsVector3(en.center), en.radius, en.startAngle, en.endAngle, false);
app.Database.ModelSpace.Append(arc);
}
else if (en.type === "CIRCLE")
{
let cir = new Circle(AsVector3(en.center), en.radius);
app.Database.ModelSpace.Append(cir);
}
else if (en.type === "LINE")
{
if (!(en.vertices.length === 2))
return;
let line = new Line(AsVector3(en.vertices[0]), AsVector3(en.vertices[1]));
app.Database.ModelSpace.Append(line);
let parser = new DxfParser();
let str = await FileSystem.ReadFileAsText(f);
let dxfDocument = parser.parseSync(str);
for (let en of dxfDocument.entities)
{
if (en.type === "LWPOLYLINE")
{
let pl = new Polyline();
pl.LineData = en.vertices.map(p =>
{
return {
pt: AsVector2(p),
bul: p.bulge ? p.bulge : 0
};
});
pl.CloseMark = en.shape;
app.Database.ModelSpace.Append(pl);
}
else if (en.type === "ARC")
{
let arc = new Arc(AsVector3(en.center), en.radius, en.startAngle, en.endAngle, false);
app.Database.ModelSpace.Append(arc);
}
else if (en.type === "CIRCLE")
{
let cir = new Circle(AsVector3(en.center), en.radius);
app.Database.ModelSpace.Append(cir);
}
else if (en.type === "LINE")
{
if (!(en.vertices.length === 2))
return;
let line = new Line(AsVector3(en.vertices[0]), AsVector3(en.vertices[1]));
app.Database.ModelSpace.Append(line);
}
}
}
}
}
}, "dxf插入");
}
}
});
}
}

@ -8,7 +8,7 @@ import { Board, BoardType } from "../DatabaseServices/Entity/Board";
import { ExtrudeSolid } from "../DatabaseServices/Entity/Extrude";
import { Polyline, PolylineProps } from "../DatabaseServices/Entity/Polyline";
import { TemplateRecord } from "../DatabaseServices/Template/TemplateRecord";
import { Command } from "../Editor/CommandMachine";
import { Command, CommandWrap } from "../Editor/CommandMachine";
import { Vec2 } from "../Geometry/CheckIntersect";
import { AsVector2, equaln } from "../Geometry/GeUtils";
import { Vec3 } from "../Geometry/IVec3";
@ -105,28 +105,32 @@ export class Command_KJLImport implements Command
{
async exec()
{
let flist = await FileSystem.ChooseFile(".json", false);
if (flist.length > 0)
{
let f = flist.item(0);
let fstr = await FileSystem.ReadFileAsText(f);
let fileData = JSON.parse(fstr) as KJL_JsonFile;
let roomMap = ParseRoomNameMap(fileData.designData);
for (let m of fileData.paramModel)
FileSystem.ChooseFile({
filter: ".json", multiple: false, callback: (files) =>
{
let roomName = roomMap.get(m.roomId);
let gName = m.modelBrandGoodName;
ParseModel(m, roomName, gName);
CommandWrap(async () =>
{
let f = files.item(0);
let fstr = await FileSystem.ReadFileAsText(f);
let fileData = JSON.parse(fstr) as KJL_JsonFile;
let roomMap = ParseRoomNameMap(fileData.designData);
for (let m of fileData.paramModel)
{
let roomName = roomMap.get(m.roomId);
let gName = m.modelBrandGoodName;
ParseModel(m, roomName, gName);
}
let ens = app.CommandReactor._createObejcts.filter(obj => obj instanceof Board) as Board[];
if (ens.length === 0)
return true;
let ok = await JigMoveEntity(ens);
return !ok;
}, "酷家乐导入");
}
let ens = app.CommandReactor._createObejcts.filter(obj => obj instanceof Board) as Board[];
if (ens.length === 0)
return true;
let ok = await JigMoveEntity(ens);
return !ok;
}
});
}
}

@ -23,24 +23,25 @@ export class UpLoadConfig implements Command
{
async exec()
{
let files = await FileSystem.ChooseFile(".json");
if (files.length === 1)
{
let f = files[0];
let fileData = JSON.parse(await FileSystem.ReadFileAsText(f));
for (let i in fileData)
FileSystem.ChooseFile({
filter: ".json", callback: async (files) =>
{
if (fileData.hasOwnProperty(i) && fileData[i])
let f = files[0];
let fileData = JSON.parse(await FileSystem.ReadFileAsText(f));
for (let i in fileData)
{
let configs = (await userConfigStore.GetAllConfigs(i as BoardModalType)) || {};
Object.assign(configs, fileData[i]);
await PostJson(ConfigUrls.Edit, { key: i, value: JSON.stringify(configs) });
if (fileData.hasOwnProperty(i) && fileData[i])
{
let configs = (await userConfigStore.GetAllConfigs(i as BoardModalType)) || {};
Object.assign(configs, fileData[i]);
await PostJson(ConfigUrls.Edit, { key: i, value: JSON.stringify(configs) });
}
}
AppToaster.show({
message: "上传完成",
timeout: 1000,
});
}
}
AppToaster.show({
message: "上传完成",
timeout: 1000,
});
}
}

@ -2,47 +2,53 @@ import { LoadingManager, Mesh, MeshNormalMaterial } from "three";
import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader";
import { app } from "../ApplicationServices/Application";
import { FileSystem } from "../Common/FileSystem";
import { Command } from "../Editor/CommandMachine";
import { Command, CommandWrap } from "../Editor/CommandMachine";
import { GetBox, MoveMatrix } from "../Geometry/GeUtils";
export class Fbx implements Command
{
async exec()
{
let files = await FileSystem.ChooseFile(".fbx");
let m = new MeshNormalMaterial();
for (let i = 0; i < files.length; i++)
{
let f = files.item(i);
let reader = new FileReader();
// Closure to capture the file information.
reader.onload = (ev) =>
FileSystem.ChooseFile({
filter: ".fbx", callback: async (files) =>
{
let manager = new LoadingManager();
let loader = new FBXLoader(manager);
let obj = loader.parse(reader.result as string, "");
obj.traverse(o =>
CommandWrap(() =>
{
if (o.type === "Mesh")
let m = new MeshNormalMaterial();
for (let i = 0; i < files.length; i++)
{
(<Mesh>o).material = m;
let f = files.item(i);
let reader = new FileReader();
// Closure to capture the file information.
reader.onload = (ev) =>
{
let manager = new LoadingManager();
let loader = new FBXLoader(manager);
let obj = loader.parse(reader.result as string, "");
obj.traverse(o =>
{
if (o.type === "Mesh")
{
(<Mesh>o).material = m;
}
})
let box = GetBox(obj);
let mp = box.min.clone().negate();
obj.applyMatrix(MoveMatrix(mp));
obj.matrixWorldNeedsUpdate = true;
app.Viewer.Scene.add(obj);
}
// Read in the image file as a data URL.
reader.readAsArrayBuffer(f);
}
})
let box = GetBox(obj);
let mp = box.min.clone().negate();
obj.applyMatrix(MoveMatrix(mp));
obj.matrixWorldNeedsUpdate = true;
app.Viewer.Scene.add(obj);
}, "fbx");
}
// Read in the image file as a data URL.
reader.readAsArrayBuffer(f);
}
});
}
}

@ -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;
let _return = async () =>
{
if (_returned) return;
_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;
document.body.onfocus = _return;
let chooser = document.createElement("input");
chooser.type = "file";
chooser.style.display = "none";
document.body.appendChild(chooser);
chooser.accept = filter;
chooser.onchange = _return;
chooser.multiple = multiple;
chooser.click();
this.chooserInput = document.createElement("input");
this.chooserInput.type = "file";
this.chooserInput.style.display = "none";
document.body.appendChild(this.chooserInput);
}
});
};
this.chooserInput.accept = filter;
this.chooserInput.onchange = () =>
{
if (this.chooserInput.files.length > 0)
callback(this.chooserInput.files);
};
this.chooserInput.multiple = multiple;
this.chooserInput.click();
}
/**
* Used as an alternative to chooseFile for saving files in the browser.

Loading…
Cancel
Save