选择文件使用回调而不是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 { 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) =>
for (let i = 0; i < files.length; i++)
{
let f = files.item(i);
let ext = arrayLast(f.name.split("."));
if (ext.toUpperCase() === "DXF")
{ {
let parser = new DxfParser(); CommandWrap(async () =>
let str = await FileSystem.ReadFileAsText(f);
let dxfDocument = parser.parseSync(str);
for (let en of dxfDocument.entities)
{ {
if (en.type === "LWPOLYLINE") for (let i = 0; i < files.length; i++)
{ {
let pl = new Polyline(); let f = files.item(i);
pl.LineData = en.vertices.map(p =>
let ext = arrayLast(f.name.split("."));
if (ext.toUpperCase() === "DXF")
{ {
return { let parser = new DxfParser();
pt: AsVector2(p), let str = await FileSystem.ReadFileAsText(f);
bul: p.bulge ? p.bulge : 0 let dxfDocument = parser.parseSync(str);
}; for (let en of dxfDocument.entities)
}); {
pl.CloseMark = en.shape; if (en.type === "LWPOLYLINE")
app.Database.ModelSpace.Append(pl); {
} let pl = new Polyline();
else if (en.type === "ARC") pl.LineData = en.vertices.map(p =>
{ {
let arc = new Arc(AsVector3(en.center), en.radius, en.startAngle, en.endAngle, false); return {
app.Database.ModelSpace.Append(arc); pt: AsVector2(p),
} bul: p.bulge ? p.bulge : 0
else if (en.type === "CIRCLE") };
{ });
let cir = new Circle(AsVector3(en.center), en.radius); pl.CloseMark = en.shape;
app.Database.ModelSpace.Append(cir); app.Database.ModelSpace.Append(pl);
} }
else if (en.type === "LINE") else if (en.type === "ARC")
{ {
if (!(en.vertices.length === 2)) let arc = new Arc(AsVector3(en.center), en.radius, en.startAngle, en.endAngle, false);
return; app.Database.ModelSpace.Append(arc);
let line = new Line(AsVector3(en.vertices[0]), AsVector3(en.vertices[1])); }
app.Database.ModelSpace.Append(line); 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 { 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,28 +105,32 @@ 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);
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); CommandWrap(async () =>
let gName = m.modelBrandGoodName; {
ParseModel(m, roomName, gName); 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() async exec()
{ {
let files = await FileSystem.ChooseFile(".json"); FileSystem.ChooseFile({
if (files.length === 1) filter: ".json", callback: async (files) =>
{
let f = files[0];
let fileData = JSON.parse(await FileSystem.ReadFileAsText(f));
for (let i in fileData)
{ {
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)) || {}; if (fileData.hasOwnProperty(i) && fileData[i])
Object.assign(configs, fileData[i]); {
await PostJson(ConfigUrls.Edit, { key: i, value: JSON.stringify(configs) }); 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 { 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) =>
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) =>
{ {
let manager = new LoadingManager(); CommandWrap(() =>
let loader = new FBXLoader(manager);
let obj = loader.parse(reader.result as string, "");
obj.traverse(o =>
{ {
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);
} }
}) }, "fbx");
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);
}
} }
} }

@ -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;
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.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. * Used as an alternative to chooseFile for saving files in the browser.

Loading…
Cancel
Save