sdk.ts 4.2 KB

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