sdk.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import cover from './cover'
  2. import { createLoadPack, loadLib } from '@/utils'
  3. import { FuseModelAttrs, FuseModel, GuidePath, MeasureType, Measure as StoreMeasure, MeasurePosition } from '@/store'
  4. import type { Emitter } from 'mitt'
  5. import { SettingResourceType } from '@/api/setting-resource'
  6. type SceneModelAttrs = FuseModelAttrs & { select: boolean }
  7. export type SceneModel = ToChangeAPI<SceneModelAttrs>
  8. & {
  9. bus: Emitter<
  10. Pick<SceneModelAttrs, 'select'> &
  11. {
  12. loadError: void,
  13. loadDone: void,
  14. loadProgress: number,
  15. changeSelect: boolean,
  16. transformChanged: {
  17. position?: SceneLocalPos,
  18. scale?: number,
  19. rotation?: SceneLocalPos,
  20. bottom?: number
  21. }
  22. }
  23. >
  24. destroy: () => void
  25. enterRotateMode: () => void
  26. enterMoveMode: () => void
  27. leaveTransform: () => void
  28. enterAlignment: () => void
  29. leaveAlignment: () => void
  30. enterScaleSet:() => ScaleSet
  31. leaveScaleSet: () => void
  32. }
  33. export interface ScaleSet {
  34. setLength: (length: number) => void,
  35. startMeasure: () => void
  36. }
  37. export type ModelAttrRange = {
  38. [key in 'opacity' | 'bottom' | 'scale' as `${key}Range`]: {
  39. min: number,
  40. max: number,
  41. step: number
  42. }
  43. }
  44. export type AddModelProps = Pick<FuseModel, 'url' | 'id'>
  45. & FuseModelAttrs
  46. & { type: string, isDynamicAdded: boolean, mode: 'many' | 'single' }
  47. & ModelAttrRange
  48. export type SceneGuidePath = Pick<GuidePath, 'position' | 'target' | 'speed' | 'time'>
  49. export interface SceneGuide {
  50. bus: Emitter<{ changePoint: number; playComplete: void }>
  51. play: () => void
  52. pause: () => void
  53. clear: () => void
  54. }
  55. export type ScenePos = { localPos: SceneLocalPos, modelId: FuseModel['id'] }
  56. export type ScreenPos = {
  57. trueSide: boolean,
  58. pos: ScreenLocalPos,
  59. modelId: FuseModel['id']
  60. }
  61. export interface CameraComeToProps {
  62. position: SceneLocalPos;
  63. target?: SceneLocalPos;
  64. dur?: number,
  65. modelId?: FuseModel['id'],
  66. distance?: 1 | 2 | 3
  67. }
  68. export type CalcPathProps = [[SceneGuidePath, SceneGuidePath], Partial<Pick<SceneGuidePath, 'time' | 'speed'>>]
  69. export interface MeasureBase {
  70. destroy?: () => void
  71. show: () => void
  72. hide: () => void
  73. fly: () => void
  74. bus: Emitter<{ update: [MeasurePosition['point'][], MeasurePosition['modelId'][]]; highlight: boolean }>
  75. changeSelect: (isHight: boolean) => void
  76. setPositions: (points: MeasurePosition['point'][], modelIds: MeasurePosition['modelId'][]) => void
  77. }
  78. export type Measure<T extends StoreMeasure['type'] = StoreMeasure['type']> = MeasureBase & (
  79. T extends MeasureType.area
  80. ? { getArea: () => {value: number} }
  81. : { getDistance: () => {value: number} }
  82. )
  83. export type StartMeasure<T extends StoreMeasure['type']> = Measure<T> & {
  84. bus: Emitter<{ submit: [MeasurePosition['point'][], MeasurePosition['modelId'][]]; cancel: void; invalidPoint: string }>
  85. }
  86. export interface SDK {
  87. layout: HTMLDivElement,
  88. sceneBus: Emitter<{ 'cameraChange': SceneLocalPos }>
  89. setBackdrop: (drop: string, type: SettingResourceType, scale: number) => void
  90. compassVisibility: (visibility: boolean) => void
  91. addModel: (props: AddModelProps) => SceneModel
  92. enableMap(dom: HTMLDivElement, latlng: number[]): void
  93. switchMapType: (type: string) => void
  94. showGrid: () => void
  95. hideGrid: () => void
  96. calcPathInfo: (paths: CalcPathProps[0], info: CalcPathProps[1]) => Required<CalcPathProps[1]>
  97. getPositionByScreen: (screenPos: ScreenLocalPos, modelId?: FuseModel['id']) => ScenePos & {worldPos: SceneLocalPos} | null
  98. getScreenByPosition: (localPos: SceneLocalPos, modelId?: FuseModel['id']) => ScreenPos | null
  99. screenshot: (width: number, height: number) => Promise<string>
  100. getPose: () => { position: SceneLocalPos, target: SceneLocalPos }
  101. comeTo: (pos: CameraComeToProps) => void
  102. enterSceneGuide: (data: SceneGuidePath[]) => SceneGuide,
  103. drawMeasure<T extends StoreMeasure['type']>(type: T, points: MeasurePosition['point'][], modelIds: MeasurePosition['modelId'][]): Measure<T>,
  104. startMeasure<T extends StoreMeasure['type']>(type: T): StartMeasure<T> ,
  105. }
  106. export let sdk: SDK
  107. export type InialSDKProps = { layout: HTMLDivElement }
  108. export let initialed = false
  109. export const initialSDK = async (props: InialSDKProps) => {
  110. if (initialed) return;
  111. initialed = true
  112. const libs = [
  113. `./lib/proj4/proj4.js`,
  114. `./lib/jquery/jquery-3.1.1.min.js`,
  115. `./lib/other/BinaryHeap.js`,
  116. `./lib/tween/tween.min.js`,
  117. `./lib/plasio/js/laslaz.js`,
  118. `./lib/plasio/vendor/bluebird.js`,
  119. `./lib/plasio/workers/laz-loader-worker.js`,
  120. `./lib/plasio/workers/laz-perf.js`,
  121. ]
  122. await Promise.all(libs.map(loadLib))
  123. await loadLib(`./lib/potree/potree.js`)
  124. const localSdk = cover(props.layout, false) as unknown as SDK
  125. (window as any).sdk = sdk = localSdk
  126. sdk.layout = props.layout
  127. sdk.hideGrid();
  128. sdk.screenshot = createLoadPack(sdk.screenshot)
  129. }
  130. export default sdk!