transform.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import {AttachCAD} from '../index'
  2. declare global { interface Window { opera: boolean; } }
  3. export interface DOMTransform {
  4. openMouseHandle: () => void
  5. propsChange: () => void
  6. closeMouseHandle: () => void
  7. }
  8. // 给cad附加矩阵转换功能 如放大缩小
  9. export const attchDOMTranform = (cad: AttachCAD) => {
  10. // 点击在cad上认为要平移
  11. const down = (dev: MouseEvent) => {
  12. console.log(cad.processing)
  13. let render = cad.processing.render
  14. if (dev.target !== render.svg) return;
  15. const left = render.props.left
  16. const top = render.props.top
  17. const move = (mev: MouseEvent) => {
  18. render.props.left = left - (dev.pageX - mev.pageX) * render.props.multiple
  19. render.props.top = top - (dev.pageY - mev.pageY) * render.props.multiple
  20. render.adaptLayer()
  21. cad.propsChange && cad.propsChange()
  22. mev.preventDefault()
  23. }
  24. const up = () => {
  25. document.documentElement.removeEventListener('mousemove', move, false)
  26. document.documentElement.removeEventListener('mouseup', up, false)
  27. }
  28. document.documentElement.addEventListener('mousemove', move, false)
  29. document.documentElement.addEventListener('mouseup', up, false)
  30. dev.preventDefault()
  31. }
  32. // 缩放
  33. const wheel = (ev: any) => {
  34. let render = cad.processing.render
  35. let delta = ev.wheelDelta ? //IE、chrome浏览器使用的是wheelDelta,并且值为“正负120”
  36. (window.opera ? -ev.wheelDelta / 120 : ev.wheelDelta / 120) : //因为IE、chrome等向下滚动是负值,FF是正值,为了处理一致性,在此取反处理
  37. (ev.detail ? -ev.detail / 3 : 0); //FF浏览器使用的是detail,其值为“正负3”
  38. let scale = render.props.scale + (delta > 0 ? 0.08 : -0.08)
  39. if (scale > 0.1) {
  40. render.props.scale = scale
  41. render.adaptLayer()
  42. cad.propsChange && cad.propsChange()
  43. }
  44. }
  45. // 开启缩放模式
  46. cad.openMouseHandle = () => {
  47. let layer = cad.layer
  48. layer.addEventListener('mousedown', down, false)
  49. layer.addEventListener('mousewheel', wheel, false)
  50. }
  51. // 关闭缩放模式
  52. cad.closeMouseHandle = () => {
  53. let layer = cad.layer
  54. layer.removeEventListener('mousedown', down, false)
  55. layer.removeEventListener('mousewheel', wheel, false)
  56. }
  57. let destroy = cad.destroy
  58. cad.destroy = function(...args) {
  59. cad.closeMouseHandle()
  60. destroy.apply(this, args)
  61. }
  62. }