sdk.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  1. import { FloorType } from "./floorplan";
  2. import { DataSetAtom, DownType } from "./dataset";
  3. import { CoordType } from "./coord";
  4. import { Emitter } from "mitt";
  5. import { ColorMode, DensityType, Shape } from "./setting";
  6. import { MeasureType, MeasureUnit } from "./measure";
  7. import { Pos, Pos3D } from ".";
  8. import { HotAtom } from "..";
  9. import { UN_DE_RES } from "@/dbo/interfaces";
  10. import { ModelModelAtom } from "./model";
  11. /**
  12. * 参数说明
  13. * point 真实位置
  14. * screen 在DOM中的位置
  15. */
  16. export type SceneEventMap = {
  17. buildingChange: ModelModelAtom;
  18. allLoaded: void;
  19. posChange: Pos3D & { dataset: string[] };
  20. loaded: void;
  21. webglError: void;
  22. visible: boolean;
  23. };
  24. export type PointInfo = {
  25. position: Pos3D;
  26. datasetId: string;
  27. dataset_location: Pos3D;
  28. };
  29. // scene和map都要实现的基础
  30. export type Base = Emitter<SceneEventMap> & {
  31. // 通过DOM坐标获取真实坐标
  32. getPointByScreen: (screen?: Pos & { inDrag?: boolean }) => PointInfo | null;
  33. // 通过真实坐标获取DOM坐标
  34. getScreenByPoint: (
  35. point: Pos,
  36. slide?: boolean
  37. ) => { pos: Pos; trueSide: boolean };
  38. screenshot: (width: number, height: number) => {finishPromise: Promise<{ dataUrl: string }>, meterPerPixel: number};
  39. el: HTMLElement;
  40. };
  41. export type Transform = {
  42. rotation: [number, number, number];
  43. position: [number, number, number];
  44. };
  45. export type ObjInfo = {
  46. objurl: string;
  47. mtlurl: string;
  48. transform: Transform;
  49. };
  50. export type Measure = {
  51. getPoints: () => Array<Pos3D>;
  52. getArea: () => { value: number; string: string };
  53. getDistance: () => { value: number; string: string };
  54. clear: () => void;
  55. show: () => void;
  56. hide: () => void;
  57. changeUnit: (unit: MeasureUnit) => void;
  58. toDataURL: (
  59. width: number,
  60. height: number
  61. ) => {
  62. dataUrl: string;
  63. pose: Pose;
  64. };
  65. bus: Emitter<{ update: Measure; selected: boolean, firstClickMarker: void }>;
  66. getDatasets: () => Array<string>;
  67. getDatasetId: () => string;
  68. getDatasetLocations: () => Array<Pos3D>;
  69. highlight: (isHight: boolean) => void;
  70. };
  71. export type StartMeasure = Measure & {
  72. bus: Emitter<{ end: Measure; quit: Measure; invalidPoint: string }> &
  73. Measure["bus"];
  74. quit: () => void;
  75. end: () => void;
  76. };
  77. export type Crop = {
  78. bus: Emitter<{
  79. select: Array<DataSet>;
  80. updateSelectedDatasets: Array<DataSet["id"]>;
  81. }>;
  82. setSelect(datasets: Array<DataSet>): void;
  83. close(): void;
  84. toBlob(type: string, epsg?: string, name?: string): string;
  85. };
  86. export type DataSet = {
  87. setFloorPan(URL: string): void;
  88. getFloorPan(): string;
  89. gentDownURL(type: DownType): string;
  90. id: string;
  91. changeDisplay(show: boolean): void;
  92. changeColor(color: string): void;
  93. getAttachPloygon(): Ploygon;
  94. focus(): void;
  95. flyTo(): boolean;
  96. };
  97. export type NavigationResult = {
  98. time: number;
  99. dis: number;
  100. steps: Array<{
  101. desc: string;
  102. dis: number;
  103. }>;
  104. };
  105. export type Navigation = {
  106. setStartPoint(pos: PointInfo, inMap: boolean, datasetId?: string): void;
  107. setEndPoint(pos: PointInfo, inMap: boolean, datasetId?: string): void;
  108. generate(): Promise<NavigationResult | UN_DE_RES | string>;
  109. destroy(): void;
  110. bus: Emitter<{
  111. reposStartMarker: Pos3D;
  112. reposEndMarker: Pos3D;
  113. }>;
  114. };
  115. export type Pose = {
  116. position: Pos3D;
  117. yaw: number;
  118. pitch: number;
  119. };
  120. export type PoseVideoInfo = {
  121. position: Pos3D;
  122. target: Pos3D;
  123. time?: number;
  124. };
  125. export enum Mode {
  126. pano = 0,
  127. cloud = 1,
  128. }
  129. export type PloygonArgs = {
  130. flagPano: string;
  131. panos: number[];
  132. isNew: boolean;
  133. holes: Array<Pos[] | Pos3D[]>;
  134. points: Array<Pos3D | Pos>;
  135. parent: Ploygon | null;
  136. isUpdate: boolean;
  137. type: "building" | "floor" | "room";
  138. attach?: "top" | "bottom"; // floor特有
  139. zs: [number, number];
  140. // area: number
  141. // color: string
  142. };
  143. export type Ploygon = {
  144. changeHeight: (v: number) => number;
  145. digHole: () => void;
  146. getPano: () => { flagPano: string; panos: number[] };
  147. bus: Emitter<{ update: PloygonArgs; delete: void; complete: void }>;
  148. select: (isSelect: boolean) => void;
  149. reset: (PloygonArgs) => void;
  150. show: () => void;
  151. hide: () => void;
  152. delete: () => void;
  153. getArea: () => number;
  154. getVolume: () => number;
  155. getPoints: () => PloygonArgs;
  156. focus: () => number;
  157. isDelete: boolean;
  158. };
  159. export type FView = {
  160. //全屏漫游视图
  161. fullRoamView: () => void;
  162. // 全屏顶视图
  163. fullTopView: () => void;
  164. // 全屏右视图
  165. fullLeftSideView: () => void;
  166. // 全屏左视图
  167. fullRightSideView: () => void;
  168. // 退出全屏
  169. quitFull: () => void;
  170. enableTopMap: (enabled: boolean) => void;
  171. enableTopFloorPan: (enabled: boolean) => void;
  172. clear: () => void;
  173. focusOnDataset: (id: string) => void;
  174. };
  175. export type SiteMode = FView & {
  176. save: () => void;
  177. drawPloygon: (ploygon: PloygonArgs) => Ploygon;
  178. };
  179. export enum AlignmentTransform {
  180. "+x" = "+x",
  181. "-x" = "-x",
  182. "+y" = "+y",
  183. "-y" = "-y",
  184. "+z" = "+z",
  185. "-z" = "-z",
  186. }
  187. export enum AlignmentHandler {
  188. translate = "translate",
  189. rotate = "rotate",
  190. }
  191. export type AlignmentMode = FView & {
  192. translate: (str: AlignmentTransform) => void;
  193. rotate: (rotateNum: number) => void;
  194. switchHandle: (handler: AlignmentHandler) => void;
  195. selectDatasets: (datasets: Array<DataSet>) => void;
  196. save: () => Promise<void>;
  197. bus: Emitter<{ saveSuccess: void; moveInitialDataset: void; changed: void }>;
  198. };
  199. export type SiteModeInfoAtom =
  200. | (DataSetAtom & { type: "dataset" })
  201. | (Omit<PloygonArgs, "parent" | "isNew" | "attach"> & {
  202. children: Array<SiteModeInfoAtom>;
  203. });
  204. export type SiteModeInfo = SiteModeInfoAtom[];
  205. export type Scene = Base & {
  206. getDownloadInfo: () => any;
  207. currentCamera(): Pos3D;
  208. quitMeasure(): void;
  209. changeMode(mode: Mode): void;
  210. getCurrentMode(): Mode;
  211. startMeasure(type: MeasureType, unit: MeasureUnit, color: string): StartMeasure;
  212. drawMeasure(
  213. type: MeasureType,
  214. unit: MeasureUnit,
  215. points: ReturnType<Measure["getPoints"]>,
  216. datasetId: DataSetAtom["id"],
  217. datasetPoints: Array<Pos3D>,
  218. pointsDatasets: string[],
  219. sid: string,
  220. color: string
  221. ): Measure;
  222. trackScenePos: () => { promise: Promise<Pos3D>, quit: () => void}
  223. comeToMeasure: (measure: Measure) => Promise<void>;
  224. comeToTag: (pos: Pos3D) => Promise<void>;
  225. comeToHot: (hot: HotAtom) => Promise<void>;
  226. hotTransform: (pos: HotAtom) => Pos3D;
  227. // 漫游到指定位置
  228. comeTo: (pos: { position: Pos; target?: Pos; dur?: number }) => void;
  229. // 设置点云密度
  230. changePointDensity(type: DensityType): { percent: number };
  231. // 设置漫游点位显示
  232. changePanoPoint(show: boolean): void;
  233. // 设置色彩模式
  234. changeColorMode(mode: ColorMode): { opacity: number; size: number };
  235. // 设置范围
  236. changeViewRange(num: number): void;
  237. // 设置点透明度
  238. changePointOpacity(num: number): void;
  239. // 设置点大小
  240. changePointSize(num: number): void;
  241. // 设置点形状 传入参数 1 矩形 2 圆形
  242. changePointShape(shape: Shape): void;
  243. // 设置是否强化边缘
  244. changePointEdge(isStrong: boolean): void;
  245. changeDensityPercent(detail: number): void;
  246. // 打开裁剪模式
  247. openCropMode: () => Crop;
  248. // 查看是否支持全景图
  249. canTurnToPanoMode: (pos?: Pos3D) => boolean;
  250. canShapeToPanoMode: (poss?: Pos3D[]) => boolean;
  251. // 获取数据集
  252. getDataSets: () => Array<DataSet>;
  253. // 开启关闭放大镜
  254. openMagnifier: () => void;
  255. closeMagnifier: () => void;
  256. // 设置和获取当前位置信息
  257. getPose: () => Promise<Pose>;
  258. setPose: (pose: Pose) => void;
  259. getPose2: () => PoseVideoInfo;
  260. };
  261. export type PoseVideo = {
  262. points: PoseVideoInfo[];
  263. duration: number;
  264. name?: string;
  265. };
  266. export type TourVideo = {
  267. bus: Emitter<{ changePoint: number; playComplete: void }>;
  268. addPoint: (
  269. index: number,
  270. pos: PoseVideoInfo["position"],
  271. target: PoseVideoInfo["target"]
  272. ) => void;
  273. deletePoint: (index: number) => void;
  274. play: () => void;
  275. pause: () => void;
  276. setDuration: (a: number) => void;
  277. clear: () => void;
  278. };
  279. export type ZoomInfo = { zoomLevel: number; meterPerPixel: number };
  280. export type Map = Emitter<{ mapZoomLevelChange: ZoomInfo }> &
  281. Base & {
  282. getMapZoomLevel: () => ZoomInfo;
  283. setFloorplanEnable: (enable: boolean) => void;
  284. showDatasetFloor: (datasetId: DataSetAtom["id"]) => void;
  285. comeTo: (pos: { position: Pos; dur: number; zoom: number }) => void;
  286. };
  287. export type LaserSDKProps = {
  288. sceneEl: Element;
  289. num: string;
  290. webSite: string;
  291. isDebug?: boolean;
  292. getFileUrl: (url: string) => Promise<string>
  293. axios: any;
  294. basePath: string;
  295. };
  296. export enum TypeEmu {
  297. FIRE = "FIRE",
  298. BLAST = "BLAST",
  299. SMOKE = "SMOKE",
  300. }
  301. export type InsertEffectProp = {
  302. points: Pos3D[];
  303. radius?: number;
  304. height?: number;
  305. strength?: number;
  306. time?: number;
  307. color?: string;
  308. };
  309. export type Effect = {
  310. bus: Emitter<{ delete: void; update: InsertEffectProp; end: void }>;
  311. delete: () => void;
  312. switchEditState: (v: boolean) => void;
  313. hide: () => void;
  314. show: () => void;
  315. setRadius: (p: number) => void;
  316. setHeight: (p: number) => void;
  317. setStrength: (p: number) => void;
  318. setTime: (p: number) => void;
  319. setColor: (p: string) => void;
  320. fly: () => void;
  321. };
  322. export type Cloud = {
  323. uuid: string;
  324. pose: {
  325. rotation: Pos3D & { w: number };
  326. translation: Pos3D;
  327. };
  328. group: number;
  329. subgroup: number;
  330. visibles: number[];
  331. };
  332. export type EditCloudsArgs<T extends string = "clouds"> = ({
  333. [key in T]: Cloud[];
  334. } & { datasetId: string })[];
  335. export type ECloudsViewMode = "top" | "side" | "3d";
  336. export type EditClouds = {
  337. bus: Emitter<{
  338. select: Cloud;
  339. cancelMove: void;
  340. cancelScale: void;
  341. needToDisConnect: void;
  342. cancelRotate: void;
  343. cancelConnect: void;
  344. cancelDisconnect: void;
  345. switchPanoVisible: [panosData: Cloud, visible: boolean];
  346. }>;
  347. changeShow(data: Cloud, show: boolean);
  348. changeRTK(data: Cloud, open: boolean);
  349. select: (data: Cloud) => void;
  350. moveMode: () => () => void;
  351. scaleMode: () => () => void;
  352. rotateMode: () => () => void;
  353. connectMode: () => void;
  354. disconnectMode: () => void;
  355. save: () => { sweepLocations: Cloud[] };
  356. calc: () => Promise<{ sweepLocations: Cloud[] } | string>;
  357. switchViewMode: (mode: ECloudsViewMode) => void;
  358. };
  359. export type ECropArgs = {};
  360. export type ECropViewMode = "top" | "3d";
  361. export type CropShape = {
  362. delete: () => void;
  363. };
  364. export type EditCrop = {
  365. // 你发送我
  366. bus: Emitter<{
  367. // 取消移动模式
  368. cancelMove: void;
  369. // 取消放大缩小模式
  370. cancelScale: void;
  371. // 取消旋转模式
  372. cancelRotate: void;
  373. // 取消排除模式
  374. cancelExclude: void;
  375. // 取消交集模式
  376. cancelIntersect: void;
  377. // 选择裁剪形状
  378. selectShape: CropShape;
  379. // 取消选择裁剪形状
  380. unSelectShape: void;
  381. }>;
  382. // 进入移动模式 返回取消移动函数
  383. moveMode: () => () => void;
  384. // 进入放大模式 返回取消放大函数
  385. scaleMode: () => () => void;
  386. // 进入旋转模式 返回取消旋转函数
  387. rotateMode: () => () => void;
  388. // 进入排除模式 返回取消排除函数
  389. excludeMode: () => void;
  390. // 进入交集模式 返回取消交集函数
  391. intersectMode: () => void;
  392. // 保存时调用 返回要发送给服务端的参数
  393. save: () => ECropArgs;
  394. // 计算时调用 返回要发送给服务端的参数 或者是报错的字符串
  395. calc: () => Promise<ECropArgs | string>;
  396. // 切换视图 参数为 'top' | '3d'
  397. switchViewMode: (mode: ECropViewMode) => void;
  398. // 清除所有
  399. clearAll: () => void;
  400. };
  401. export type LaserSDK = {
  402. map: Map;
  403. scene: Scene;
  404. enterDatasetsManage: () => any;
  405. enterTopView: () => any,
  406. leaveTopView: () => any,
  407. leaveDatasetsManage: () => any;
  408. getPointByEntity: (id: string) => Pos3D;
  409. entityIncludePoint: (id: string, pos: Pos3D) => boolean;
  410. gotoEntity: (
  411. id: string,
  412. isNearBy: boolean
  413. ) => boolean | "posNoChange" | "tooFar" | "deferred";
  414. focusEntity: (id: string) => void;
  415. openSplitScreen: () => void;
  416. setSplitScreenSize: (size: number) => void;
  417. setSplitScreenDir: (dir: "leftRight" | "upDown") => void;
  418. closeSplitScreen: () => void;
  419. setFloorplanType: (type: FloorType, datasetid: DataSetAtom["id"]) => void;
  420. // 地图全屏显示
  421. mapFullShow(): void;
  422. // 地图全屏显示
  423. sceneFullShow(): void;
  424. minimumShow(): void;
  425. minimumHide(): void;
  426. getEntityByPoint: (pos: Pos3D) => ModelModelAtom;
  427. // 设置地图可视
  428. changeScene(show: boolean): void;
  429. // 是否禁用平面图
  430. setFloorplanEnable: (Enable: boolean) => void;
  431. // 创建导航对象
  432. createNavigation: () => Navigation;
  433. // 坐标转换
  434. coordTransform: <T extends CoordType, K extends CoordType>(
  435. originType: T,
  436. pos: T extends CoordType.SCENE_SCREEN | CoordType.MAP_SCREEN ? Pos : Pos3D,
  437. targetType: K,
  438. datasetId?: string,
  439. originHandler?: boolean
  440. ) => Pos | Pos3D;
  441. enterSiteMode: () => SiteMode;
  442. enterAlignment: () => AlignmentMode;
  443. enterEditClouds: (data: EditCloudsArgs) => EditClouds;
  444. enterEditCrop: () => EditCrop;
  445. transformPoint: (
  446. point: Pos3D,
  447. datasetId: string,
  448. dataset_location: Pos3D
  449. ) => Pos3D;
  450. enterMeasurement: () => void;
  451. leaveMeasurement: () => void;
  452. refreshFloorPan: () => void;
  453. reloadDatasets: () => void;
  454. setMapEnable: (enable: boolean) => void;
  455. setSiteModelInfo(tree: SiteModeInfo): void;
  456. enterGeoRegistration(): void;
  457. leaveGeoRegistration(): void;
  458. enterTourEdit: (data: PoseVideo) => TourVideo;
  459. enterFireEdit: () => void;
  460. insertEffect: (
  461. type: TypeEmu,
  462. prop: InsertEffectProp,
  463. edit: boolean
  464. ) => Effect;
  465. debug: boolean;
  466. // 加载小物体
  467. loadObj: (info: ObjInfo) => Promise<void>;
  468. loadModel: (info: ObjInfo) => Promise<void>;
  469. };