useLaser.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { sdkFactory, SDK, SDKProps, Pos3D, Mode } from "@/sdk";
  2. import { store } from "@/store";
  3. import { loadLib } from "@/utils";
  4. import { Message } from "@kankan/components/index";
  5. import { ui18n } from "@/lang";
  6. import { DataSetAtom } from "@/sdk";
  7. import {laserModeStack} from "@/hook/custom";
  8. let sdk: SDK;
  9. export const useSDK = () => sdk;
  10. export const setSDK = (ssdk: SDK) => (sdk = ssdk);
  11. export const useDataset = (dataset: DataSetAtom) => {
  12. const sdkDatasets = sdk.scene.getDataSets();
  13. const rdataset = sdkDatasets.find((atom) => atom.id === dataset.id);
  14. if (rdataset) {
  15. const flyToRaw = rdataset.flyTo.bind(rdataset);
  16. rdataset.flyTo = () => {
  17. const success = flyToRaw();
  18. useCanFly(success);
  19. return success;
  20. };
  21. }
  22. return rdataset;
  23. };
  24. const listenLoaded: Function[] = [];
  25. export const useAsyncSDK = () => {
  26. if (sdk) {
  27. return Promise.resolve(sdk);
  28. } else {
  29. return new Promise<SDK>((resolve) => {
  30. listenLoaded.push(resolve);
  31. });
  32. }
  33. };
  34. let initial = false;
  35. export const loadSetupLaser = async () => {
  36. if (initial) {
  37. return useAsyncSDK();
  38. }
  39. initial = true;
  40. const libs = [
  41. `./static/lib/proj4/proj4.js`,
  42. `./static/lib/jquery/jquery-3.1.1.min.js`,
  43. `./static/lib/other/BinaryHeap.js`,
  44. `./static/lib/tween/tween.min.js`,
  45. ];
  46. await Promise.all(libs.map(loadLib));
  47. await loadLib(`./static/lib/potree/potree.js`);
  48. };
  49. export const setupLaser = async (
  50. props: Omit<SDKProps, "store"> & { store: typeof store }
  51. ) => {
  52. await loadSetupLaser();
  53. return new Promise<SDK>((resolve) => {
  54. sdk = sdkFactory(props as any);
  55. sdk.scene.on("allLoaded", () => {
  56. console.error("allloaded")
  57. resolve(sdk)
  58. });
  59. }).then((sdk) => {
  60. for (const fn of listenLoaded) {
  61. setTimeout(fn, 0, sdk);
  62. }
  63. listenLoaded.length = 0;
  64. return sdk;
  65. });
  66. };
  67. export const useCanFly = (
  68. pos: Pos3D | Pos3D[] | ReturnType<SDK["gotoEntity"]>,
  69. message = ui18n.t("scene.flyUnImages")
  70. ) => {
  71. let isFly = true;
  72. if (["tooFar"].includes(pos as string)) {
  73. if (pos === "posNoChange") {
  74. message = ui18n.t("scene.flyCurrent");
  75. }
  76. isFly = false;
  77. }
  78. if (laserModeStack.current.value.value === Mode.pano && isFly) {
  79. if (typeof pos === "string") {
  80. isFly = true;
  81. } else if (typeof pos === "boolean") {
  82. isFly = pos;
  83. } else {
  84. const poss = Array.isArray(pos) ? pos : [pos as Pos3D];
  85. isFly = sdk.scene.canShapeToPanoMode(poss);
  86. }
  87. }
  88. isFly || Message.warning(message);
  89. return isFly;
  90. };
  91. export const useFlyTag = (pos: Pos3D) => {
  92. let isFly = useCanFly(pos);
  93. return sdk.scene.comeToTag(pos);
  94. };
  95. export const useFlyEntity = (
  96. pos: Pos3D | Pos3D[],
  97. ...args: Parameters<SDK["gotoEntity"]>
  98. ) => {
  99. console.error(args);
  100. return useCanFly(sdk.gotoEntity(...args));
  101. };
  102. export const useFlyMeasure = (
  103. pos: Pos3D | Pos3D[],
  104. ...args: Parameters<SDK["scene"]["comeToMeasure"]>
  105. ) => {
  106. let isFly = useCanFly(pos);
  107. return sdk.scene.comeToMeasure(...args);
  108. };