|
@@ -1,171 +1,190 @@
|
|
|
-import { watchEffect, nextTick } from 'vue'
|
|
|
-import { fuseModelsLoaded, scenes, SceneType, setting } from '@/store'
|
|
|
-import { fuseModel } from './'
|
|
|
-import { initialSDK, initialed as fuseInitialed, sdk as fuseSDK } from '@/sdk'
|
|
|
-import { asyncTimeout } from '@/utils'
|
|
|
+import { watchEffect, nextTick } from "vue";
|
|
|
+import { fuseModelsLoaded, scenes, SceneType, setting } from "@/store";
|
|
|
+import { fuseModel } from "./";
|
|
|
+import { initialSDK, initialed as fuseInitialed, sdk as fuseSDK } from "@/sdk";
|
|
|
+import { asyncTimeout } from "@/utils";
|
|
|
|
|
|
-import type { ModelType } from './'
|
|
|
+import type { ModelType } from "./";
|
|
|
+import { aMapToWgs84 } from "@/utils/coord";
|
|
|
|
|
|
-export async function modelSDKFactory (
|
|
|
- type: ModelType,
|
|
|
+export async function modelSDKFactory(
|
|
|
+ type: ModelType,
|
|
|
dom: HTMLDivElement | HTMLIFrameElement
|
|
|
): Promise<ModelExpose> {
|
|
|
- console.log(type, dom)
|
|
|
+ console.log(type, dom);
|
|
|
if (type === fuseModel) {
|
|
|
+ const center = aMapToWgs84({
|
|
|
+ x: setting.value!.lonlat![0],
|
|
|
+ y: setting.value!.lonlat![1],
|
|
|
+ });
|
|
|
+ console.log([center.x, center.y], setting.value!.lonlat);
|
|
|
if (!fuseInitialed) {
|
|
|
- await initialSDK({ layout: dom, scenes: scenes.value, lonlat: setting.value!.lonlat })
|
|
|
+ await initialSDK({
|
|
|
+ layout: dom,
|
|
|
+ scenes: scenes.value,
|
|
|
+ lonlat: [center.x, center.y],
|
|
|
+ });
|
|
|
}
|
|
|
- return exposeFactory(fuseModel)
|
|
|
+ return exposeFactory(fuseModel);
|
|
|
} else {
|
|
|
- const iframe = dom as HTMLIFrameElement
|
|
|
+ const iframe = dom as HTMLIFrameElement;
|
|
|
const win = await new Promise<Window | null>((resolve, reject) => {
|
|
|
const loadedHandler = () => {
|
|
|
- resolve(iframe.contentWindow)
|
|
|
- cleanup()
|
|
|
- }
|
|
|
+ resolve(iframe.contentWindow);
|
|
|
+ cleanup();
|
|
|
+ };
|
|
|
const errorHandler = (err: any) => {
|
|
|
- reject(err)
|
|
|
- cleanup()
|
|
|
- }
|
|
|
+ reject(err);
|
|
|
+ cleanup();
|
|
|
+ };
|
|
|
const cleanup = () => {
|
|
|
- iframe.removeEventListener('load', loadedHandler)
|
|
|
- iframe.removeEventListener('error', errorHandler)
|
|
|
- }
|
|
|
- iframe.addEventListener('load', loadedHandler)
|
|
|
- iframe.addEventListener('error', errorHandler)
|
|
|
- })
|
|
|
+ iframe.removeEventListener("load", loadedHandler);
|
|
|
+ iframe.removeEventListener("error", errorHandler);
|
|
|
+ };
|
|
|
+ iframe.addEventListener("load", loadedHandler);
|
|
|
+ iframe.addEventListener("error", errorHandler);
|
|
|
+ });
|
|
|
|
|
|
if (!win) {
|
|
|
- throw new Error('场景加载失败')
|
|
|
+ throw new Error("场景加载失败");
|
|
|
}
|
|
|
- return await exposeFactory(type, win)
|
|
|
+ return await exposeFactory(type, win);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-const findObjectAttr = <T, K extends keyof T>(data: T, key: K): Promise<T[K]> => {
|
|
|
- return new Promise<T[K]>(resolve => {
|
|
|
+const findObjectAttr = <T, K extends keyof T>(
|
|
|
+ data: T,
|
|
|
+ key: K
|
|
|
+): Promise<T[K]> => {
|
|
|
+ return new Promise<T[K]>((resolve) => {
|
|
|
const query = () => {
|
|
|
if (key in data) {
|
|
|
- resolve(data[key])
|
|
|
+ resolve(data[key]);
|
|
|
} else {
|
|
|
- setTimeout(query, 6)
|
|
|
+ setTimeout(query, 6);
|
|
|
}
|
|
|
- }
|
|
|
- query()
|
|
|
- })
|
|
|
-}
|
|
|
+ };
|
|
|
+ query();
|
|
|
+ });
|
|
|
+};
|
|
|
|
|
|
-const fuseLoaded = new Promise<void>(resolve => {
|
|
|
+const fuseLoaded = new Promise<void>((resolve) => {
|
|
|
const stop = watchEffect(() => {
|
|
|
if (fuseModelsLoaded.value) {
|
|
|
- resolve()
|
|
|
- nextTick(() => stop())
|
|
|
+ resolve();
|
|
|
+ nextTick(() => stop());
|
|
|
}
|
|
|
- })
|
|
|
-})
|
|
|
+ });
|
|
|
+});
|
|
|
|
|
|
export interface ModelExpose {
|
|
|
- getView: () => Promise<{ image: Blob, flyData: string }>
|
|
|
- setView: (flyData: string) => void
|
|
|
+ getView: () => Promise<{ image: Blob; flyData: string }>;
|
|
|
+ setView: (flyData: string) => void;
|
|
|
}
|
|
|
|
|
|
-export async function exposeFactory(type: ModelType, win?: any): Promise<ModelExpose> {
|
|
|
- const sceneType = type === fuseModel ? fuseModel : type.type
|
|
|
- const platforms: {[key in any]: {getSDK: () => Promise<any>, expose: ModelExpose}} = {
|
|
|
+export async function exposeFactory(
|
|
|
+ type: ModelType,
|
|
|
+ win?: any
|
|
|
+): Promise<ModelExpose> {
|
|
|
+ const sceneType = type === fuseModel ? fuseModel : type.type;
|
|
|
+ const platforms: {
|
|
|
+ [key in any]: { getSDK: () => Promise<any>; expose: ModelExpose };
|
|
|
+ } = {
|
|
|
[fuseModel]: {
|
|
|
getSDK: async () => {
|
|
|
- await fuseLoaded
|
|
|
- return fuseSDK
|
|
|
+ await fuseLoaded;
|
|
|
+ return fuseSDK;
|
|
|
},
|
|
|
expose: {
|
|
|
async getView() {
|
|
|
- const dataURL = await sdk.screenshot(260, 160)
|
|
|
- const res = await fetch(dataURL)
|
|
|
- const image = await res.blob()
|
|
|
- const pose = sdk.getPose()
|
|
|
+ const dataURL = await sdk.screenshot(260, 160);
|
|
|
+ const res = await fetch(dataURL);
|
|
|
+ const image = await res.blob();
|
|
|
+ const pose = sdk.getPose();
|
|
|
return {
|
|
|
image,
|
|
|
- flyData: JSON.stringify(pose)
|
|
|
- }
|
|
|
+ flyData: JSON.stringify(pose),
|
|
|
+ };
|
|
|
},
|
|
|
async setView(flyData: string) {
|
|
|
- const pose = JSON.parse(flyData)
|
|
|
- sdk.comeTo({ dur: 300, ...pose })
|
|
|
- }
|
|
|
- }
|
|
|
+ const pose = JSON.parse(flyData);
|
|
|
+ sdk.comeTo({ dur: 300, ...pose });
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
[SceneType.SWKK]: {
|
|
|
getSDK: async () => {
|
|
|
- const sdk = await findObjectAttr(win , '__sdk')
|
|
|
+ const sdk = await findObjectAttr(win, "__sdk");
|
|
|
if (!sdk.Scene.loaded) {
|
|
|
- await new Promise(reoslve => sdk.Scene.on('loaded', reoslve))
|
|
|
+ await new Promise((reoslve) => sdk.Scene.on("loaded", reoslve));
|
|
|
}
|
|
|
- return sdk
|
|
|
+ return sdk;
|
|
|
},
|
|
|
expose: {
|
|
|
async getView() {
|
|
|
- const pose = sdk.Camera.getPose()
|
|
|
+ const pose = sdk.Camera.getPose();
|
|
|
const images = await sdk.Camera.screenshot(
|
|
|
- [{ width: 260, height: 160, name: '2k' }],
|
|
|
+ [{ width: 260, height: 160, name: "2k" }],
|
|
|
true
|
|
|
- )
|
|
|
+ );
|
|
|
return {
|
|
|
- image: images[0].data,
|
|
|
- flyData: JSON.stringify(pose)
|
|
|
- }
|
|
|
+ image: images[0].data,
|
|
|
+ flyData: JSON.stringify(pose),
|
|
|
+ };
|
|
|
},
|
|
|
async setView(flyData: string) {
|
|
|
- const pose = JSON.parse(flyData)
|
|
|
- sdk.Camera.setPose({ dur: 300, ...pose })
|
|
|
- }
|
|
|
- }
|
|
|
+ const pose = JSON.parse(flyData);
|
|
|
+ sdk.Camera.setPose({ dur: 300, ...pose });
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
[SceneType.SWSS]: {
|
|
|
getSDK: async () => {
|
|
|
- await findObjectAttr(win, 'laserLoaded')
|
|
|
- return await findObjectAttr(win, '__sdk')
|
|
|
+ await findObjectAttr(win, "laserLoaded");
|
|
|
+ return await findObjectAttr(win, "__sdk");
|
|
|
},
|
|
|
expose: {
|
|
|
async getView() {
|
|
|
- const dataURL = await sdk.scene.screenshot(260, 160)
|
|
|
- const res = await fetch(dataURL.dataUrl)
|
|
|
- const image = await res.blob()
|
|
|
- const pose = await sdk.scene.getPose()
|
|
|
- const mode = sdk.customMap.mode
|
|
|
+ const dataURL = await sdk.scene.screenshot(260, 160);
|
|
|
+ const res = await fetch(dataURL.dataUrl);
|
|
|
+ const image = await res.blob();
|
|
|
+ const pose = await sdk.scene.getPose();
|
|
|
+ const mode = sdk.customMap.mode;
|
|
|
|
|
|
return {
|
|
|
- image,
|
|
|
- flyData: JSON.stringify({ pose, mode })
|
|
|
- }
|
|
|
+ image,
|
|
|
+ flyData: JSON.stringify({ pose, mode }),
|
|
|
+ };
|
|
|
},
|
|
|
async setView(flyData: string) {
|
|
|
- const { pose, mode } = JSON.parse(flyData)
|
|
|
- sdk.customMap.mode = mode
|
|
|
- sdk.scene.setPose(pose, 300)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- platforms[SceneType.SWYDSS] = platforms[SceneType.SWSS]
|
|
|
- platforms[SceneType.SWYDMX] = platforms[SceneType.SWSSMX] = platforms[SceneType.SWKJ] = platforms[SceneType.SWKK]
|
|
|
+ const { pose, mode } = JSON.parse(flyData);
|
|
|
+ sdk.customMap.mode = mode;
|
|
|
+ sdk.scene.setPose(pose, 300);
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ };
|
|
|
+ platforms[SceneType.SWYDSS] = platforms[SceneType.SWSS];
|
|
|
+ platforms[SceneType.SWYDMX] =
|
|
|
+ platforms[SceneType.SWSSMX] =
|
|
|
+ platforms[SceneType.SWKJ] =
|
|
|
+ platforms[SceneType.SWKK];
|
|
|
platforms[SceneType.SWMX] = {
|
|
|
getSDK: async () => {
|
|
|
- const sdk = await findObjectAttr(win , '__sdk')
|
|
|
+ const sdk = await findObjectAttr(win, "__sdk");
|
|
|
// await new Promise(resolve => setTimeout(resolve, 2000))
|
|
|
- return sdk
|
|
|
+ return sdk;
|
|
|
},
|
|
|
- expose: platforms[fuseModel].expose
|
|
|
- }
|
|
|
+ expose: platforms[fuseModel].expose,
|
|
|
+ };
|
|
|
|
|
|
if (!(sceneType in platforms)) {
|
|
|
- throw new Error('不支持该类型场景!')
|
|
|
+ throw new Error("不支持该类型场景!");
|
|
|
}
|
|
|
|
|
|
const sdk: any = await Promise.race([
|
|
|
- asyncTimeout(100000)
|
|
|
- .then(() => Promise.reject(new Error('加载超时'))),
|
|
|
- platforms[sceneType].getSDK()
|
|
|
- ])
|
|
|
- return platforms[sceneType].expose
|
|
|
-}
|
|
|
+ asyncTimeout(100000).then(() => Promise.reject(new Error("加载超时"))),
|
|
|
+ platforms[sceneType].getSDK(),
|
|
|
+ ]);
|
|
|
+ return platforms[sceneType].expose;
|
|
|
+}
|