您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

duplicate.ts 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import Command from './command'
  2. import history from '../history'
  3. import { Data } from 'types'
  4. import {
  5. getCurrentCamera,
  6. getPage,
  7. getSelectedShapes,
  8. setSelectedIds,
  9. } from 'utils/utils'
  10. import { uniqueId } from 'utils/utils'
  11. import { current } from 'immer'
  12. import vec from 'utils/vec'
  13. export default function duplicateCommand(data: Data): void {
  14. const { currentPageId } = data
  15. const selectedShapes = getSelectedShapes(current(data))
  16. const duplicates = selectedShapes.map((shape) => ({
  17. ...shape,
  18. id: uniqueId(),
  19. point: vec.add(shape.point, vec.div([16, 16], getCurrentCamera(data).zoom)),
  20. isGenerated: false,
  21. }))
  22. history.execute(
  23. data,
  24. new Command({
  25. name: 'duplicate_shapes',
  26. category: 'canvas',
  27. manualSelection: true,
  28. do(data) {
  29. const { shapes } = getPage(data, currentPageId)
  30. for (const duplicate of duplicates) {
  31. shapes[duplicate.id] = duplicate
  32. }
  33. setSelectedIds(
  34. data,
  35. duplicates.map((d) => d.id)
  36. )
  37. },
  38. undo(data) {
  39. const { shapes } = getPage(data, currentPageId)
  40. for (const duplicate of duplicates) {
  41. delete shapes[duplicate.id]
  42. }
  43. setSelectedIds(
  44. data,
  45. selectedShapes.map((d) => d.id)
  46. )
  47. },
  48. })
  49. )
  50. }