sdk.ts 15 KB

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