sdk.ts 13 KB

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