useCADViewer.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { CAD_VIEWER_IFRAME_ID } from '../viewer.data';
  2. import { message } from 'ant-design-vue';
  3. import { transformCadFile } from '../viewer.api';
  4. import { SupportedOperationName } from '../types';
  5. import { useGlobSetting } from '/@/hooks/setting';
  6. const globSetting = useGlobSetting();
  7. const baseApiUrl = globSetting.domainUrl;
  8. // 先设计成这样避免hooks无法取消注册
  9. const hooks = new Map<SupportedOperationName, () => void>();
  10. export default function useCADViewer() {
  11. /** 向CADViewer发送指令 */
  12. function postMessage(cmd: SupportedOperationName, param?: unknown) {
  13. const dom = document.getElementById(CAD_VIEWER_IFRAME_ID) as any;
  14. if (!dom) message.info('CAD预览器尚未准备好,请稍后再试');
  15. dom.contentWindow.postMessage(
  16. {
  17. cmd: cmd,
  18. type: 'sendStringToExecute',
  19. param: param,
  20. },
  21. '*'
  22. );
  23. }
  24. /** 调用 api 转换文件格式,并返回转换后文件的网络地址 */
  25. function processFile(file: Blob) {
  26. const data = new FormData();
  27. data.append('file', file);
  28. const close = message.loading('正在转换文件格式,请稍等', 0);
  29. return transformCadFile(data)
  30. .then((result) => {
  31. const filepath = result.replace('/data/file/', '');
  32. if (import.meta.env.PROD) {
  33. return `${baseApiUrl}/sys/common/static/${filepath}`.replace(/\/+/g, '/');
  34. } else {
  35. return import.meta.env.VITE_GLOB_DOMAIN_URL + `/sys/common/static/${filepath}`.replace(/\/+/g, '/');
  36. }
  37. })
  38. .finally(() => {
  39. close();
  40. });
  41. }
  42. function registHook(name: SupportedOperationName, callback: () => void) {
  43. hooks.set(name, callback);
  44. }
  45. function triggerHook(name: SupportedOperationName) {
  46. if (hooks.has(name)) {
  47. const fn = hooks.get(name) as () => void;
  48. fn();
  49. }
  50. }
  51. function unregistHook(name: SupportedOperationName) {
  52. hooks.delete(name);
  53. }
  54. return {
  55. /** 向CADViewer发送指令 */
  56. postMessage,
  57. /** 调用 api 转换文件格式,并返回转换后文件的网络地址 */
  58. processFile,
  59. /** 注册Hook函数,同名的Hook函数将覆盖,常用于在某些指令执行完毕后做处理 */
  60. registHook,
  61. /** 触发Hook函数 */
  62. triggerHook,
  63. /** 解除注册Hook函数 */
  64. unregistHook,
  65. };
  66. }