BendpointUtil.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import {
  2. toPoint
  3. } from '../../util/Event';
  4. import {
  5. getMidPoint,
  6. pointsAligned
  7. } from '../../util/Geometry';
  8. import {
  9. append as svgAppend,
  10. attr as svgAttr,
  11. classes as svgClasses,
  12. create as svgCreate
  13. } from 'tiny-svg';
  14. import {
  15. rotate,
  16. translate
  17. } from '../../util/SvgTransformUtil';
  18. export var BENDPOINT_CLS = 'djs-bendpoint';
  19. export var SEGMENT_DRAGGER_CLS = 'djs-segment-dragger';
  20. export function toCanvasCoordinates(canvas, event) {
  21. var position = toPoint(event),
  22. clientRect = canvas._container.getBoundingClientRect(),
  23. offset;
  24. // canvas relative position
  25. offset = {
  26. x: clientRect.left,
  27. y: clientRect.top
  28. };
  29. // update actual event payload with canvas relative measures
  30. var viewbox = canvas.viewbox();
  31. return {
  32. x: viewbox.x + (position.x - offset.x) / viewbox.scale,
  33. y: viewbox.y + (position.y - offset.y) / viewbox.scale
  34. };
  35. }
  36. export function addBendpoint(parentGfx, cls) {
  37. var groupGfx = svgCreate('g');
  38. svgClasses(groupGfx).add(BENDPOINT_CLS);
  39. svgAppend(parentGfx, groupGfx);
  40. var visual = svgCreate('circle');
  41. svgAttr(visual, {
  42. cx: 0,
  43. cy: 0,
  44. r: 4
  45. });
  46. svgClasses(visual).add('djs-visual');
  47. svgAppend(groupGfx, visual);
  48. var hit = svgCreate('circle');
  49. svgAttr(hit, {
  50. cx: 0,
  51. cy: 0,
  52. r: 10
  53. });
  54. svgClasses(hit).add('djs-hit');
  55. svgAppend(groupGfx, hit);
  56. if (cls) {
  57. svgClasses(groupGfx).add(cls);
  58. }
  59. return groupGfx;
  60. }
  61. function createParallelDragger(parentGfx, position, alignment) {
  62. var draggerGfx = svgCreate('g');
  63. svgAppend(parentGfx, draggerGfx);
  64. var width = 14,
  65. height = 3,
  66. padding = 6,
  67. hitWidth = width + padding,
  68. hitHeight = height + padding;
  69. var visual = svgCreate('rect');
  70. svgAttr(visual, {
  71. x: -width / 2,
  72. y: -height / 2,
  73. width: width,
  74. height: height
  75. });
  76. svgClasses(visual).add('djs-visual');
  77. svgAppend(draggerGfx, visual);
  78. var hit = svgCreate('rect');
  79. svgAttr(hit, {
  80. x: -hitWidth / 2,
  81. y: -hitHeight / 2,
  82. width: hitWidth,
  83. height: hitHeight
  84. });
  85. svgClasses(hit).add('djs-hit');
  86. svgAppend(draggerGfx, hit);
  87. rotate(draggerGfx, alignment === 'h' ? 90 : 0, 0, 0);
  88. return draggerGfx;
  89. }
  90. export function addSegmentDragger(parentGfx, segmentStart, segmentEnd) {
  91. var groupGfx = svgCreate('g'),
  92. mid = getMidPoint(segmentStart, segmentEnd),
  93. alignment = pointsAligned(segmentStart, segmentEnd);
  94. svgAppend(parentGfx, groupGfx);
  95. createParallelDragger(groupGfx, mid, alignment);
  96. svgClasses(groupGfx).add(SEGMENT_DRAGGER_CLS);
  97. svgClasses(groupGfx).add(alignment === 'h' ? 'vertical' : 'horizontal');
  98. translate(groupGfx, mid.x, mid.y);
  99. return groupGfx;
  100. }