sdk.ts 14 KB

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