@operato/scene-basic 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +0 -0
  3. package/demo/index.html +158 -0
  4. package/demo/things-scene-basic.html +6 -0
  5. package/dist/anchors/ellipse-anchors.d.ts +7 -0
  6. package/dist/anchors/ellipse-anchors.js +43 -0
  7. package/dist/anchors/ellipse-anchors.js.map +1 -0
  8. package/dist/audio.d.ts +25 -0
  9. package/dist/audio.js +141 -0
  10. package/dist/audio.js.map +1 -0
  11. package/dist/cloud.d.ts +13 -0
  12. package/dist/cloud.js +30 -0
  13. package/dist/cloud.js.map +1 -0
  14. package/dist/donut.d.ts +15 -0
  15. package/dist/donut.js +74 -0
  16. package/dist/donut.js.map +1 -0
  17. package/dist/ellipse.d.ts +24 -0
  18. package/dist/ellipse.js +72 -0
  19. package/dist/ellipse.js.map +1 -0
  20. package/dist/gif-view.d.ts +18 -0
  21. package/dist/gif-view.js +116 -0
  22. package/dist/gif-view.js.map +1 -0
  23. package/dist/image-view.d.ts +19 -0
  24. package/dist/image-view.js +180 -0
  25. package/dist/image-view.js.map +1 -0
  26. package/dist/index.d.ts +11 -0
  27. package/dist/index.js +15 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/outline/ellipse-outline.d.ts +2 -0
  30. package/dist/outline/ellipse-outline.js +11 -0
  31. package/dist/outline/ellipse-outline.js.map +1 -0
  32. package/dist/polygon.d.ts +19 -0
  33. package/dist/polygon.js +84 -0
  34. package/dist/polygon.js.map +1 -0
  35. package/dist/polyline.d.ts +18 -0
  36. package/dist/polyline.js +102 -0
  37. package/dist/polyline.js.map +1 -0
  38. package/dist/rect.d.ts +19 -0
  39. package/dist/rect.js +60 -0
  40. package/dist/rect.js.map +1 -0
  41. package/dist/star.d.ts +13 -0
  42. package/dist/star.js +80 -0
  43. package/dist/star.js.map +1 -0
  44. package/dist/templates/audio.d.ts +14 -0
  45. package/dist/templates/audio.js +15 -0
  46. package/dist/templates/audio.js.map +1 -0
  47. package/dist/templates/color-image.d.ts +22 -0
  48. package/dist/templates/color-image.js +23 -0
  49. package/dist/templates/color-image.js.map +1 -0
  50. package/dist/templates/donut.d.ts +22 -0
  51. package/dist/templates/donut.js +23 -0
  52. package/dist/templates/donut.js.map +1 -0
  53. package/dist/templates/ellipse.d.ts +21 -0
  54. package/dist/templates/ellipse.js +22 -0
  55. package/dist/templates/ellipse.js.map +1 -0
  56. package/dist/templates/gif-image.d.ts +14 -0
  57. package/dist/templates/gif-image.js +15 -0
  58. package/dist/templates/gif-image.js.map +1 -0
  59. package/dist/templates/gray-image.d.ts +22 -0
  60. package/dist/templates/gray-image.js +23 -0
  61. package/dist/templates/gray-image.js.map +1 -0
  62. package/dist/templates/index.d.ts +74 -0
  63. package/dist/templates/index.js +15 -0
  64. package/dist/templates/index.js.map +1 -0
  65. package/dist/templates/polygon.d.ts +22 -0
  66. package/dist/templates/polygon.js +25 -0
  67. package/dist/templates/polygon.js.map +1 -0
  68. package/dist/templates/polyline.d.ts +22 -0
  69. package/dist/templates/polyline.js +25 -0
  70. package/dist/templates/polyline.js.map +1 -0
  71. package/dist/templates/rect.d.ts +21 -0
  72. package/dist/templates/rect.js +22 -0
  73. package/dist/templates/rect.js.map +1 -0
  74. package/dist/templates/star.d.ts +23 -0
  75. package/dist/templates/star.js +24 -0
  76. package/dist/templates/star.js.map +1 -0
  77. package/dist/templates/text.d.ts +27 -0
  78. package/dist/templates/text.js +28 -0
  79. package/dist/templates/text.js.map +1 -0
  80. package/dist/templates/triangle.d.ts +23 -0
  81. package/dist/templates/triangle.js +24 -0
  82. package/dist/templates/triangle.js.map +1 -0
  83. package/dist/text.d.ts +6 -0
  84. package/dist/text.js +11 -0
  85. package/dist/text.js.map +1 -0
  86. package/dist/triangle.d.ts +14 -0
  87. package/dist/triangle.js +75 -0
  88. package/dist/triangle.js.map +1 -0
  89. package/icons/audio.png +0 -0
  90. package/icons/both-arrow.png +0 -0
  91. package/icons/color-image.png +0 -0
  92. package/icons/container.png +0 -0
  93. package/icons/dash.png +0 -0
  94. package/icons/donut.png +0 -0
  95. package/icons/ellipse.png +0 -0
  96. package/icons/gif-image.png +0 -0
  97. package/icons/global-reference.png +0 -0
  98. package/icons/gray-image.png +0 -0
  99. package/icons/humidity-sensor.png +0 -0
  100. package/icons/info-window.png +0 -0
  101. package/icons/line.png +0 -0
  102. package/icons/local-reference.png +0 -0
  103. package/icons/no-image.png +0 -0
  104. package/icons/ortholine.png +0 -0
  105. package/icons/person.png +0 -0
  106. package/icons/polygon.png +0 -0
  107. package/icons/polyline.png +0 -0
  108. package/icons/popup.png +0 -0
  109. package/icons/rect.png +0 -0
  110. package/icons/single-arrow.png +0 -0
  111. package/icons/star.png +0 -0
  112. package/icons/text.png +0 -0
  113. package/icons/triangle.png +0 -0
  114. package/package.json +61 -0
  115. package/src/anchors/ellipse-anchors.ts +46 -0
  116. package/src/audio.ts +173 -0
  117. package/src/cloud.ts +40 -0
  118. package/src/donut.ts +92 -0
  119. package/src/ellipse.ts +90 -0
  120. package/src/gif-view.ts +146 -0
  121. package/src/image-view.ts +215 -0
  122. package/src/index.ts +16 -0
  123. package/src/outline/ellipse-outline.ts +15 -0
  124. package/src/polygon.ts +103 -0
  125. package/src/polyline.ts +122 -0
  126. package/src/rect.ts +71 -0
  127. package/src/star.ts +104 -0
  128. package/src/templates/audio.ts +15 -0
  129. package/src/templates/color-image.ts +23 -0
  130. package/src/templates/donut.ts +23 -0
  131. package/src/templates/ellipse.ts +22 -0
  132. package/src/templates/gif-image.ts +15 -0
  133. package/src/templates/gray-image.ts +23 -0
  134. package/src/templates/index.ts +16 -0
  135. package/src/templates/polygon.ts +25 -0
  136. package/src/templates/polyline.ts +25 -0
  137. package/src/templates/rect.ts +22 -0
  138. package/src/templates/star.ts +24 -0
  139. package/src/templates/text.ts +28 -0
  140. package/src/templates/triangle.ts +24 -0
  141. package/src/text.ts +12 -0
  142. package/src/triangle.ts +87 -0
  143. package/test/basic-test.html +63 -0
  144. package/test/index.html +22 -0
  145. package/things-scene.config.js +5 -0
  146. package/tsconfig.json +23 -0
  147. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,72 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Component, Connectable, Shape } from '@hatiolab/things-scene';
5
+ import ellipseAnchors from './anchors/ellipse-anchors';
6
+ import ellipseOutline from './outline/ellipse-outline';
7
+ const NATURE = {
8
+ mutable: false,
9
+ resizable: true,
10
+ rotatable: true,
11
+ properties: [],
12
+ 'value-property': 'text'
13
+ };
14
+ export default class Ellipse extends Connectable(Shape) {
15
+ is3dish() {
16
+ return true;
17
+ }
18
+ render(context) {
19
+ var { cx, cy, rx, ry, startAngle, endAngle, anticlockwise } = this.state;
20
+ context.beginPath();
21
+ context.ellipse(cx, cy, Math.abs(rx), Math.abs(ry), 0, startAngle || 0, endAngle || 2 * Math.PI, anticlockwise);
22
+ }
23
+ get path() {
24
+ var { cx, cy, rx, ry } = this.state;
25
+ return [
26
+ {
27
+ x: cx - rx,
28
+ y: cy - ry
29
+ },
30
+ {
31
+ x: cx + rx,
32
+ y: cy - ry
33
+ },
34
+ {
35
+ x: cx + rx,
36
+ y: cy + ry
37
+ },
38
+ {
39
+ x: cx - rx,
40
+ y: cy + ry
41
+ }
42
+ ];
43
+ }
44
+ set path(path) {
45
+ var left_top = path[0];
46
+ var right_bottom = path[2];
47
+ this.set({
48
+ cx: left_top.x + (right_bottom.x - left_top.x) / 2,
49
+ cy: left_top.y + (right_bottom.y - left_top.y) / 2,
50
+ rx: (right_bottom.x - left_top.x) / 2,
51
+ ry: (right_bottom.y - left_top.y) / 2
52
+ });
53
+ }
54
+ contains(x, y) {
55
+ var { cx, cy, rx, ry } = this.state;
56
+ var normx = (x - cx) / (rx * 2 - 0.5);
57
+ var normy = (y - cy) / (ry * 2 - 0.5);
58
+ return normx * normx + normy * normy < 0.25;
59
+ }
60
+ outline(progress) {
61
+ return ellipseOutline(this, progress);
62
+ }
63
+ get anchors() {
64
+ return ellipseAnchors(this);
65
+ }
66
+ get nature() {
67
+ return NATURE;
68
+ }
69
+ }
70
+ Component.memoize(Ellipse.prototype, 'path', false);
71
+ Component.register('ellipse', Ellipse);
72
+ //# sourceMappingURL=ellipse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipse.js","sourceRoot":"","sources":["../src/ellipse.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { Anchor, Component, ComponentNature, Connectable, Shape } from '@hatiolab/things-scene'\n\nimport ellipseAnchors from './anchors/ellipse-anchors'\nimport ellipseOutline from './outline/ellipse-outline'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [],\n 'value-property': 'text'\n}\n\nexport default class Ellipse extends Connectable(Shape) {\n is3dish() {\n return true\n }\n\n render(context: CanvasRenderingContext2D) {\n var { cx, cy, rx, ry, startAngle, endAngle, anticlockwise } = this.state\n\n context.beginPath()\n\n context.ellipse(cx, cy, Math.abs(rx), Math.abs(ry), 0, startAngle || 0, endAngle || 2 * Math.PI, anticlockwise)\n }\n\n get path() {\n var { cx, cy, rx, ry } = this.state\n\n return [\n {\n x: cx - rx,\n y: cy - ry\n },\n {\n x: cx + rx,\n y: cy - ry\n },\n {\n x: cx + rx,\n y: cy + ry\n },\n {\n x: cx - rx,\n y: cy + ry\n }\n ]\n }\n\n set path(path) {\n var left_top = path[0]\n var right_bottom = path[2]\n\n this.set({\n cx: left_top.x + (right_bottom.x - left_top.x) / 2,\n cy: left_top.y + (right_bottom.y - left_top.y) / 2,\n rx: (right_bottom.x - left_top.x) / 2,\n ry: (right_bottom.y - left_top.y) / 2\n })\n }\n\n contains(x: number, y: number) {\n var { cx, cy, rx, ry } = this.state\n\n var normx = (x - cx) / (rx * 2 - 0.5)\n var normy = (y - cy) / (ry * 2 - 0.5)\n\n return normx * normx + normy * normy < 0.25\n }\n\n outline(progress: number) {\n return ellipseOutline(this, progress)\n }\n\n get anchors(): Array<Anchor> {\n return ellipseAnchors(this)\n }\n\n get nature() {\n return NATURE\n }\n}\n\nComponent.memoize(Ellipse.prototype, 'path', false)\n\nComponent.register('ellipse', Ellipse)\n"]}
@@ -0,0 +1,18 @@
1
+ import { ComponentNature, HTMLOverlayElement, Properties } from '@hatiolab/things-scene';
2
+ import { SuperGif } from '@wizpanda/super-gif';
3
+ export default class GifView extends HTMLOverlayElement {
4
+ _superGif?: SuperGif;
5
+ oncreate_element(div: HTMLDivElement): Promise<void>;
6
+ buildImg(): HTMLImageElement;
7
+ onchange(after: Properties, before: Properties): void;
8
+ setElementProperties(div: HTMLDivElement): void;
9
+ onchangeplay(play: boolean): void;
10
+ onchangesrc(src: string): void;
11
+ ondropfile(transfered: DataTransferItemList, files: FileList): void;
12
+ get src(): any;
13
+ set src(src: any);
14
+ get play(): any;
15
+ set play(play: any);
16
+ get nature(): ComponentNature;
17
+ get tagName(): string;
18
+ }
@@ -0,0 +1,116 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Component, HTMLOverlayElement } from '@hatiolab/things-scene';
5
+ import { SuperGif } from '@wizpanda/super-gif';
6
+ const NATURE = {
7
+ mutable: false,
8
+ resizable: true,
9
+ rotatable: true,
10
+ properties: [
11
+ {
12
+ type: 'string',
13
+ label: 'src',
14
+ name: 'src'
15
+ },
16
+ {
17
+ type: 'checkbox',
18
+ label: 'play',
19
+ name: 'play'
20
+ }
21
+ ],
22
+ 'value-property': 'src',
23
+ help: 'scene/component/gif-view'
24
+ };
25
+ const NOIMAGE_DATA_URI = 'data:image/gif;base64,R0lGODlhYABIAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKio+Pj5iYmKCgoKampqurq66urrCwsLGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrOzs7S0tLa2tre3t7m5ubu7u7+/v8DAwMHBwcPDw8XFxcfHx8vLy8/Pz9LS0tXV1dfX193d3eTk5Onp6fj4+Pz8/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////yH5BAkAAPUAIf47R2VuZXJhdGVkIGJ5IGpzZ2lmIChodHRwczovL2dpdGh1Yi5jb20vYW50aW1hdHRlcjE1L2pzZ2lmLykALAAAAABgAEgAAAj+AGcJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmR9VKqXMmypcuXMGPKnJkSIs2bOHPqZGlzp8+fQOv1DEq0KMyhRpMmRaq0KVCmTqPmhCq1qkyqLrFRSyYwGTVsVo1iZXmNa8Fk18ISHasSm1mDycCq/ck2JTWF1ObSfTjz7cFken3WFbow8M7BDA3rHOwXruKpfGXeTZg3qDVrUge7RRg3KLZjx+Q2HVyvLNy0QaMJjBaVdD2tZr2K/mmNIObRkR+n9AsYt0Pddg1WXppb8bWDx1CLLW74GcJnSl3TtDY8Zu2Et4tKl7n52eyWnxXvhl7+26jqrspbnlfIWjtz2gWPZV95neH8veU9NxZYfbfD3kFt99J6Bnmn0mQO9XfYezrVxxlmx0GUXIAM4hSeffsxBN1TFd5E4Ef3QZbfTg6CNJ5gHXJ3TEntLThiTh+KFCJNAqZU4kgAitjQTheepOBMNcZI0oQ6JpbTjSZtiNN2PZ400IxHpdiSc07G911M0iFZZYtAStnWilUeBGVLrlEZpmM0elmPlmfO8iOZXl4DZpsGEYmll2bSWWCXLwJXVY1+urhjoGEBSuiSah6K36CKtpZoo4s9CimielZq6aWYZqrpppx26umnoIZ6UkAAOw==';
26
+ export default class GifView extends HTMLOverlayElement {
27
+ async oncreate_element(div) {
28
+ var { src, play } = this.state;
29
+ this.onchangesrc(src);
30
+ this.onchangeplay(play);
31
+ }
32
+ buildImg() {
33
+ /* clear first */
34
+ var div = this.element;
35
+ div.innerHTML = '';
36
+ var gif = document.createElement('img');
37
+ gif.style.width = '100%';
38
+ gif.style.height = '100%';
39
+ div.appendChild(gif);
40
+ return gif;
41
+ }
42
+ onchange(after, before) {
43
+ super.onchange(after, before);
44
+ 'src' in after && this.onchangesrc(after.src);
45
+ 'play' in after && this.onchangeplay(after.play);
46
+ }
47
+ setElementProperties(div) { }
48
+ onchangeplay(play) {
49
+ var superGif = this._superGif;
50
+ if (!superGif || !superGif.isReady()) {
51
+ return;
52
+ }
53
+ if (play) {
54
+ superGif.play();
55
+ }
56
+ else {
57
+ superGif.pause();
58
+ }
59
+ }
60
+ onchangesrc(src) {
61
+ var gif = this.buildImg();
62
+ if (!src)
63
+ src = NOIMAGE_DATA_URI;
64
+ gif.src = src;
65
+ gif.setAttribute('rel:animated_src', src);
66
+ gif.setAttribute('rel:auto_play', '0');
67
+ this._superGif = new SuperGif(gif, {
68
+ autoPlay: false /* Without this setting, the first play's framerate is too fast. */
69
+ });
70
+ //@ts-ignore
71
+ this._superGif.init();
72
+ for (const child of this.element.children) {
73
+ child.style.width = '100%';
74
+ child.style.height = '100%';
75
+ }
76
+ var canvas = this._superGif.getCanvas();
77
+ canvas.style.width = '100%';
78
+ canvas.style.height = '100%';
79
+ this._superGif.load(() => {
80
+ this._superGif.moveTo(0);
81
+ /*
82
+ * FIXME. this.play 는 컴포넌트의 getState()를 통해서 가져오게 되는데, 체크박스의 경우 문제가 있는 것 같다.
83
+ * 문제 해결 후 this.get("play") => this.play로 수정할 것.
84
+ */
85
+ this.play && this._superGif.play();
86
+ });
87
+ }
88
+ ondropfile(transfered, files) {
89
+ for (let i = 0; i < transfered.length; i++) {
90
+ if (/\.gif$/.test(transfered[i].name)) {
91
+ this.src = files[i];
92
+ return;
93
+ }
94
+ }
95
+ }
96
+ get src() {
97
+ return this.getState('src');
98
+ }
99
+ set src(src) {
100
+ this.set('src', src);
101
+ }
102
+ get play() {
103
+ return this.getState('play');
104
+ }
105
+ set play(play) {
106
+ this.setState('play', play);
107
+ }
108
+ get nature() {
109
+ return NATURE;
110
+ }
111
+ get tagName() {
112
+ return 'div';
113
+ }
114
+ }
115
+ Component.register('gif-view', GifView);
116
+ //# sourceMappingURL=gif-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gif-view.js","sourceRoot":"","sources":["../src/gif-view.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\nimport { Component, ComponentNature, HTMLOverlayElement, Properties, RectPath, Shape } from '@hatiolab/things-scene'\nimport { SuperGif } from '@wizpanda/super-gif'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'string',\n label: 'src',\n name: 'src'\n },\n {\n type: 'checkbox',\n label: 'play',\n name: 'play'\n }\n ],\n 'value-property': 'src',\n help: 'scene/component/gif-view'\n}\n\nconst NOIMAGE_DATA_URI =\n 'data:image/gif;base64,R0lGODlhYABIAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKio+Pj5iYmKCgoKampqurq66urrCwsLGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrOzs7S0tLa2tre3t7m5ubu7u7+/v8DAwMHBwcPDw8XFxcfHx8vLy8/Pz9LS0tXV1dfX193d3eTk5Onp6fj4+Pz8/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////yH5BAkAAPUAIf47R2VuZXJhdGVkIGJ5IGpzZ2lmIChodHRwczovL2dpdGh1Yi5jb20vYW50aW1hdHRlcjE1L2pzZ2lmLykALAAAAABgAEgAAAj+AGcJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmR9VKqXMmypcuXMGPKnJkSIs2bOHPqZGlzp8+fQOv1DEq0KMyhRpMmRaq0KVCmTqPmhCq1qkyqLrFRSyYwGTVsVo1iZXmNa8Fk18ISHasSm1mDycCq/ck2JTWF1ObSfTjz7cFken3WFbow8M7BDA3rHOwXruKpfGXeTZg3qDVrUge7RRg3KLZjx+Q2HVyvLNy0QaMJjBaVdD2tZr2K/mmNIObRkR+n9AsYt0Pddg1WXppb8bWDx1CLLW74GcJnSl3TtDY8Zu2Et4tKl7n52eyWnxXvhl7+26jqrspbnlfIWjtz2gWPZV95neH8veU9NxZYfbfD3kFt99J6Bnmn0mQO9XfYezrVxxlmx0GUXIAM4hSeffsxBN1TFd5E4Ef3QZbfTg6CNJ5gHXJ3TEntLThiTh+KFCJNAqZU4kgAitjQTheepOBMNcZI0oQ6JpbTjSZtiNN2PZ400IxHpdiSc07G911M0iFZZYtAStnWilUeBGVLrlEZpmM0elmPlmfO8iOZXl4DZpsGEYmll2bSWWCXLwJXVY1+urhjoGEBSuiSah6K36CKtpZoo4s9CimielZq6aWYZqrpppx26umnoIZ6UkAAOw=='\n\nexport default class GifView extends HTMLOverlayElement {\n _superGif?: SuperGif\n\n async oncreate_element(div: HTMLDivElement) {\n var { src, play } = this.state\n\n this.onchangesrc(src)\n this.onchangeplay(play)\n }\n\n buildImg() {\n /* clear first */\n var div = this.element\n div.innerHTML = ''\n\n var gif = document.createElement('img')\n gif.style.width = '100%'\n gif.style.height = '100%'\n\n div.appendChild(gif)\n\n return gif\n }\n\n onchange(after: Properties, before: Properties) {\n super.onchange(after, before)\n\n 'src' in after && this.onchangesrc(after.src)\n 'play' in after && this.onchangeplay(after.play)\n }\n\n setElementProperties(div: HTMLDivElement) {}\n\n onchangeplay(play: boolean) {\n var superGif = this._superGif\n\n if (!superGif || !superGif.isReady()) {\n return\n }\n\n if (play) {\n superGif.play()\n } else {\n superGif.pause()\n }\n }\n\n onchangesrc(src: string) {\n var gif = this.buildImg()\n\n if (!src) src = NOIMAGE_DATA_URI\n\n gif.src = src\n gif.setAttribute('rel:animated_src', src)\n gif.setAttribute('rel:auto_play', '0')\n\n this._superGif = new SuperGif(gif, {\n autoPlay: false /* Without this setting, the first play's framerate is too fast. */\n })\n //@ts-ignore\n this._superGif!.init()\n\n for (const child of this.element.children as any) {\n child.style.width = '100%'\n child.style.height = '100%'\n }\n\n var canvas = this._superGif!.getCanvas()\n canvas.style.width = '100%'\n canvas.style.height = '100%'\n\n this._superGif.load(() => {\n this._superGif!.moveTo(0)\n\n /*\n * FIXME. this.play 는 컴포넌트의 getState()를 통해서 가져오게 되는데, 체크박스의 경우 문제가 있는 것 같다.\n * 문제 해결 후 this.get(\"play\") => this.play로 수정할 것.\n */\n this.play && this._superGif!.play()\n })\n }\n\n ondropfile(transfered: DataTransferItemList, files: FileList) {\n for (let i = 0; i < transfered.length; i++) {\n if (/\\.gif$/.test((transfered[i] as any).name)) {\n this.src = files[i]\n return\n }\n }\n }\n\n get src() {\n return this.getState('src')\n }\n\n set src(src) {\n this.set('src', src)\n }\n\n get play() {\n return this.getState('play')\n }\n\n set play(play) {\n this.setState('play', play)\n }\n\n get nature() {\n return NATURE\n }\n\n get tagName() {\n return 'div'\n }\n}\n\nComponent.register('gif-view', GifView)\n"]}
@@ -0,0 +1,19 @@
1
+ import { ComponentNature, Properties, Shape } from '@hatiolab/things-scene';
2
+ declare const ImageView_base: typeof Shape;
3
+ export default class ImageView extends ImageView_base {
4
+ static NOIMAGE?: any;
5
+ static get noimage(): any;
6
+ _offcanvas?: HTMLCanvasElement;
7
+ _image?: any;
8
+ dispose(): void;
9
+ render(ctx: CanvasRenderingContext2D): void;
10
+ get nature(): ComponentNature;
11
+ get hasTextProperty(): boolean;
12
+ ready(): void;
13
+ prepare(resolve: (ret?: any) => void, reject: (e?: any) => void): void;
14
+ get src(): any;
15
+ set src(src: any);
16
+ onchange(after: Properties, before: Properties): void;
17
+ ondropfile(transfered: DataTransferItemList, files: FileList): void;
18
+ }
19
+ export {};
@@ -0,0 +1,180 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { error, Component, RectPath, Shape } from '@hatiolab/things-scene';
5
+ const NATURE = {
6
+ mutable: false,
7
+ resizable: true,
8
+ rotatable: true,
9
+ properties: [
10
+ {
11
+ type: 'image-selector',
12
+ label: 'image-src',
13
+ name: 'src',
14
+ property: {
15
+ displayField: 'id',
16
+ displayFullUrl: true,
17
+ baseUrlAlias: '$base_url',
18
+ defaultStorage: 'scene-image',
19
+ storageFilters: {
20
+ type: Array,
21
+ value: [
22
+ {
23
+ name: 'category',
24
+ value: 'image'
25
+ }
26
+ ]
27
+ },
28
+ useUpload: true
29
+ }
30
+ },
31
+ {
32
+ type: 'select',
33
+ label: 'cross-origin',
34
+ name: 'crossOrigin',
35
+ property: {
36
+ options: ['', 'anonymous', 'use-credentials']
37
+ }
38
+ }
39
+ ],
40
+ 'value-property': 'src',
41
+ help: 'scene/component/image-view'
42
+ };
43
+ const NOIMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABIBAMAAAD7Se1QAAAAIVBMVEUAAABHcEwBAQEREREBAQEEBAQGBgYLCwsDAwMDAwMICAi6HF9tAAAAC3RSTlNNAEAERiMYCS41Eac10lYAAAEgSURBVHhe7dY9asQwEAXgh7DNertNiJy48pIitY3SB7bYdk0ukL1BDDmA9gZecoH4pmFQ3MQayUMguPBrNPD4wD9TCMvJmt3M/AtYwXOlXiWgqADVCUBD46MAnGhMBaCiUQmAm8VA/Eh/eWl9Fn5WcxD+OLuRrUYJDKLluwH2InACUgkoACSdADxQc50Bytadb9RkM0CT13TcvlCT1HFg8UTHvasuUVACCa3El6u2UdD8LFTlKhUFFgA+d3dj10aABkUN72N3jAADCrJq7PIIsPidcxBoTHIIAjMFmyCwmGYIAA1P9gFgfCANAOsDSccCDW+uLDB+kLGg94OkZoAGkwsDDAe2DOg5oPxAg03rBR88OHpBz4N8UVeHFSwma74BTW6Ge4rIRa4AAAAASUVORK5CYII=';
44
+ export default class ImageView extends RectPath(Shape) {
45
+ static get noimage() {
46
+ if (!ImageView.NOIMAGE) {
47
+ ImageView.NOIMAGE = new Image();
48
+ ImageView.NOIMAGE.src = NOIMAGE_DATA_URI;
49
+ }
50
+ return ImageView.NOIMAGE;
51
+ }
52
+ dispose() {
53
+ super.dispose();
54
+ delete this._offcanvas;
55
+ delete this._image;
56
+ }
57
+ render(ctx) {
58
+ var { left, top, width, height, isGray = false, alpha = 1, src } = this.state;
59
+ this.prepareIf(!this._image && src);
60
+ // 박스 그리기
61
+ ctx.beginPath();
62
+ ctx.globalAlpha *= alpha;
63
+ if (this._image && this._image.complete) {
64
+ if (isGray && this._offcanvas) {
65
+ ctx.drawImage(this._offcanvas, left, top, width, height);
66
+ }
67
+ else {
68
+ try {
69
+ ctx.drawImage(this._image, left, top, width, height);
70
+ }
71
+ catch (e) {
72
+ ctx.drawImage(ImageView.noimage, left, top, width, height);
73
+ }
74
+ }
75
+ }
76
+ else {
77
+ !this.app.isViewMode && ctx.drawImage(ImageView.noimage, left, top, width, height);
78
+ }
79
+ }
80
+ get nature() {
81
+ return NATURE;
82
+ }
83
+ get hasTextProperty() {
84
+ return false;
85
+ }
86
+ ready() {
87
+ super.ready();
88
+ this.prepareIf(!this._image && this.state.src);
89
+ }
90
+ prepare(resolve, reject) {
91
+ var { src, crossOrigin } = this.state;
92
+ if (!src) {
93
+ resolve(this);
94
+ return;
95
+ }
96
+ this._image = new Image();
97
+ try {
98
+ if (crossOrigin) {
99
+ this._image.crossOrigin = crossOrigin;
100
+ }
101
+ this._image.src = this.app.url(src) || '';
102
+ }
103
+ catch (e) {
104
+ reject(e);
105
+ return;
106
+ }
107
+ this._image.onload = () => {
108
+ if (this.get('isGray')) {
109
+ let width = this._image.width;
110
+ let height = this._image.height;
111
+ this._offcanvas = Component.createCanvas(width, height);
112
+ let offcontext = this._offcanvas.getContext('2d');
113
+ offcontext.drawImage(this._image, 0, 0);
114
+ let imageData = makeGrayImage(offcontext, width, height);
115
+ offcontext.putImageData(imageData, 0, 0);
116
+ }
117
+ resolve(this);
118
+ };
119
+ this._image.onerror = (e) => {
120
+ if (this._image && !this._image.currentSrc)
121
+ this._image = null;
122
+ reject(e);
123
+ };
124
+ }
125
+ get src() {
126
+ return this.get('src');
127
+ }
128
+ set src(src) {
129
+ this.set('src', src);
130
+ }
131
+ onchange(after, before) {
132
+ if (after.hasOwnProperty('src') || after.hasOwnProperty('isGray')) {
133
+ delete this._offcanvas;
134
+ delete this._image;
135
+ this.prepareIf(after.src);
136
+ }
137
+ }
138
+ ondropfile(transfered, files) {
139
+ for (let i = 0; i < transfered.length; i++) {
140
+ if (transfered[i].type.startsWith('image/')) {
141
+ this.src = files[i];
142
+ return;
143
+ }
144
+ }
145
+ }
146
+ }
147
+ function makeGrayImage(ctx, width, height) {
148
+ try {
149
+ var img = ctx.getImageData(0, 0, width, height);
150
+ }
151
+ catch (e) {
152
+ error('Get Image Data Error: ' + e.message);
153
+ return null;
154
+ }
155
+ var data = img.data;
156
+ // Loop through data.
157
+ for (let i = 0; i < width * height * 4; i += 4) {
158
+ // First bytes are red bytes.
159
+ // Get red value.
160
+ let red = data[i];
161
+ // Second bytes are green bytes.
162
+ // Get green value.
163
+ let green = data[i + 1];
164
+ // Third bytes are blue bytes.
165
+ // Get blue value.
166
+ let blue = data[i + 2];
167
+ // Fourth bytes are alpha bytes
168
+ // We don't care about alpha here.
169
+ // Add the three values and divide by three.
170
+ // Make it an integer.
171
+ let gray = parseInt(String((red + green + blue) / 3));
172
+ // Assign average to red, green, and blue.
173
+ img.data[i] = gray;
174
+ img.data[i + 1] = gray;
175
+ img.data[i + 2] = gray;
176
+ }
177
+ return img;
178
+ }
179
+ Component.register('image-view', ImageView);
180
+ //# sourceMappingURL=image-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-view.js","sourceRoot":"","sources":["../src/image-view.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { error, Component, ComponentNature, Properties, RectPath, Shape } from '@hatiolab/things-scene'\n\nconst NATURE: ComponentNature = {\n mutable: false,\n resizable: true,\n rotatable: true,\n properties: [\n {\n type: 'image-selector',\n label: 'image-src',\n name: 'src',\n property: {\n displayField: 'id',\n displayFullUrl: true,\n baseUrlAlias: '$base_url',\n defaultStorage: 'scene-image',\n storageFilters: {\n type: Array,\n value: [\n {\n name: 'category',\n value: 'image'\n }\n ]\n },\n useUpload: true\n }\n },\n {\n type: 'select',\n label: 'cross-origin',\n name: 'crossOrigin',\n property: {\n options: ['', 'anonymous', 'use-credentials']\n }\n }\n ],\n 'value-property': 'src',\n help: 'scene/component/image-view'\n}\n\nconst NOIMAGE_DATA_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABIBAMAAAD7Se1QAAAAIVBMVEUAAABHcEwBAQEREREBAQEEBAQGBgYLCwsDAwMDAwMICAi6HF9tAAAAC3RSTlNNAEAERiMYCS41Eac10lYAAAEgSURBVHhe7dY9asQwEAXgh7DNertNiJy48pIitY3SB7bYdk0ukL1BDDmA9gZecoH4pmFQ3MQayUMguPBrNPD4wD9TCMvJmt3M/AtYwXOlXiWgqADVCUBD46MAnGhMBaCiUQmAm8VA/Eh/eWl9Fn5WcxD+OLuRrUYJDKLluwH2InACUgkoACSdADxQc50Bytadb9RkM0CT13TcvlCT1HFg8UTHvasuUVACCa3El6u2UdD8LFTlKhUFFgA+d3dj10aABkUN72N3jAADCrJq7PIIsPidcxBoTHIIAjMFmyCwmGYIAA1P9gFgfCANAOsDSccCDW+uLDB+kLGg94OkZoAGkwsDDAe2DOg5oPxAg03rBR88OHpBz4N8UVeHFSwma74BTW6Ge4rIRa4AAAAASUVORK5CYII='\n\nexport default class ImageView extends RectPath(Shape) {\n static NOIMAGE?: any\n\n static get noimage() {\n if (!ImageView.NOIMAGE) {\n ImageView.NOIMAGE = new Image()\n ImageView.NOIMAGE.src = NOIMAGE_DATA_URI\n }\n\n return ImageView.NOIMAGE\n }\n\n _offcanvas?: HTMLCanvasElement\n _image?: any\n\n dispose() {\n super.dispose()\n delete this._offcanvas\n delete this._image\n }\n\n render(ctx: CanvasRenderingContext2D) {\n var { left, top, width, height, isGray = false, alpha = 1, src } = this.state\n\n this.prepareIf(!this._image && src)\n\n // 박스 그리기\n ctx.beginPath()\n ctx.globalAlpha *= alpha\n\n if (this._image && this._image.complete) {\n if (isGray && this._offcanvas) {\n ctx.drawImage(this._offcanvas, left, top, width, height)\n } else {\n try {\n ctx.drawImage(this._image, left, top, width, height)\n } catch (e) {\n ctx.drawImage(ImageView.noimage, left, top, width, height)\n }\n }\n } else {\n !this.app.isViewMode && ctx.drawImage(ImageView.noimage, left, top, width, height)\n }\n }\n\n get nature() {\n return NATURE\n }\n\n get hasTextProperty() {\n return false\n }\n\n ready() {\n super.ready()\n this.prepareIf(!this._image && this.state.src)\n }\n\n prepare(resolve: (ret?: any) => void, reject: (e?: any) => void) {\n var { src, crossOrigin } = this.state\n\n if (!src) {\n resolve(this)\n return\n }\n\n this._image = new Image()\n\n try {\n if (crossOrigin) {\n this._image.crossOrigin = crossOrigin\n }\n\n this._image.src = this.app.url(src) || ''\n } catch (e) {\n reject(e)\n return\n }\n\n this._image.onload = () => {\n if (this.get('isGray')) {\n let width = this._image.width\n let height = this._image.height\n\n this._offcanvas = Component.createCanvas(width, height)\n\n let offcontext = this._offcanvas!.getContext('2d') as CanvasRenderingContext2D\n offcontext!.drawImage(this._image, 0, 0)\n\n let imageData = makeGrayImage(offcontext, width, height)\n offcontext!.putImageData(imageData!, 0, 0)\n }\n\n resolve(this)\n }\n\n this._image.onerror = (e: any) => {\n if (this._image && !this._image.currentSrc) this._image = null\n reject(e)\n }\n }\n\n get src() {\n return this.get('src')\n }\n\n set src(src) {\n this.set('src', src)\n }\n\n onchange(after: Properties, before: Properties) {\n if (after.hasOwnProperty('src') || after.hasOwnProperty('isGray')) {\n delete this._offcanvas\n delete this._image\n this.prepareIf(after.src)\n }\n }\n\n ondropfile(transfered: DataTransferItemList, files: FileList) {\n for (let i = 0; i < transfered.length; i++) {\n if (transfered[i].type.startsWith('image/')) {\n this.src = files[i]\n return\n }\n }\n }\n}\n\nfunction makeGrayImage(ctx: CanvasRenderingContext2D, width: number, height: number) {\n try {\n var img = ctx.getImageData(0, 0, width, height)\n } catch (e: any) {\n error('Get Image Data Error: ' + e.message)\n return null\n }\n\n var data = img.data\n // Loop through data.\n for (let i = 0; i < width * height * 4; i += 4) {\n // First bytes are red bytes.\n // Get red value.\n let red = data[i]\n\n // Second bytes are green bytes.\n // Get green value.\n let green = data[i + 1]\n\n // Third bytes are blue bytes.\n // Get blue value.\n let blue = data[i + 2]\n\n // Fourth bytes are alpha bytes\n // We don't care about alpha here.\n // Add the three values and divide by three.\n // Make it an integer.\n let gray = parseInt(String((red + green + blue) / 3))\n\n // Assign average to red, green, and blue.\n img.data[i] = gray\n img.data[i + 1] = gray\n img.data[i + 2] = gray\n }\n\n return img\n}\n\nComponent.register('image-view', ImageView)\n"]}
@@ -0,0 +1,11 @@
1
+ export { default as Ellipse } from './ellipse';
2
+ export { default as Rect } from './rect';
3
+ export { default as Polygon } from './polygon';
4
+ export { default as Polyline } from './polyline';
5
+ export { default as ImageView } from './image-view';
6
+ export { default as GifView } from './gif-view';
7
+ export { default as AudioPlayer } from './audio';
8
+ export { default as Text } from './text';
9
+ export { default as Triangle } from './triangle';
10
+ export { default as Donut } from './donut';
11
+ export { default as Star } from './star';
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ export { default as Ellipse } from './ellipse';
5
+ export { default as Rect } from './rect';
6
+ export { default as Polygon } from './polygon';
7
+ export { default as Polyline } from './polyline';
8
+ export { default as ImageView } from './image-view';
9
+ export { default as GifView } from './gif-view';
10
+ export { default as AudioPlayer } from './audio';
11
+ export { default as Text } from './text';
12
+ export { default as Triangle } from './triangle';
13
+ export { default as Donut } from './donut';
14
+ export { default as Star } from './star';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAA","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nexport { default as Ellipse } from './ellipse'\nexport { default as Rect } from './rect'\nexport { default as Polygon } from './polygon'\nexport { default as Polyline } from './polyline'\nexport { default as ImageView } from './image-view'\nexport { default as GifView } from './gif-view'\nexport { default as AudioPlayer } from './audio'\nexport { default as Text } from './text'\n\nexport { default as Triangle } from './triangle'\nexport { default as Donut } from './donut'\nexport { default as Star } from './star'\n"]}
@@ -0,0 +1,2 @@
1
+ import { Component } from '@hatiolab/things-scene';
2
+ export default function ellipseOutline(component: Component, progress: number): import("@hatiolab/things-scene").DIMENSION;
@@ -0,0 +1,11 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ export default function ellipseOutline(component, progress) {
5
+ var { cx, cy, rx, ry } = component.model;
6
+ var theta = Math.PI * 2 * progress;
7
+ var x = cx + rx * Math.cos(theta);
8
+ var y = cy + ry * Math.sin(theta);
9
+ return component.transcoordS2T(x, y);
10
+ }
11
+ //# sourceMappingURL=ellipse-outline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipse-outline.js","sourceRoot":"","sources":["../../src/outline/ellipse-outline.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,SAAoB,EAAE,QAAgB;IAC3E,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,CAAC,KAAK,CAAA;IACxC,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAA;IAElC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAEjC,OAAO,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACtC,CAAC","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { Component } from '@hatiolab/things-scene'\n\nexport default function ellipseOutline(component: Component, progress: number) {\n var { cx, cy, rx, ry } = component.model\n var theta = Math.PI * 2 * progress\n\n var x = cx + rx * Math.cos(theta)\n var y = cy + ry * Math.sin(theta)\n\n return component.transcoordS2T(x, y)\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { Component, ComponentNature, DIMENSION, Shape } from '@hatiolab/things-scene';
2
+ export default class Polygon extends Shape {
3
+ is3dish(): boolean;
4
+ get mutable(): boolean;
5
+ get pathExtendable(): boolean;
6
+ get path(): any;
7
+ set path(path: any);
8
+ contains(x: number, y: number): boolean;
9
+ get controls(): {
10
+ x: number;
11
+ y: number;
12
+ handler: {
13
+ ondragstart: (point: DIMENSION, index: number, component: Component) => void;
14
+ ondragmove: (point: DIMENSION, index: number, component: Component) => void;
15
+ ondragend: (point: DIMENSION, index: number, component: Component) => void;
16
+ };
17
+ }[];
18
+ get nature(): ComponentNature;
19
+ }
@@ -0,0 +1,84 @@
1
+ /*
2
+ * Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { Component, Shape } from '@hatiolab/things-scene';
5
+ var controlHandler = {
6
+ ondragstart: function (point, index, component) {
7
+ component.mutatePath(null, function (path) {
8
+ path.splice(index + 1, 0, point);
9
+ });
10
+ },
11
+ ondragmove: function (point, index, component) {
12
+ component.mutatePath(null, function (path) {
13
+ path[index + 1] = point;
14
+ });
15
+ },
16
+ ondragend: function (point, index, component) { }
17
+ };
18
+ const NATURE = {
19
+ mutable: true,
20
+ resizable: false,
21
+ rotatable: true,
22
+ properties: [
23
+ {
24
+ type: 'number',
25
+ label: 'round',
26
+ name: 'round',
27
+ property: {
28
+ min: 0,
29
+ max: 100,
30
+ step: 1
31
+ }
32
+ }
33
+ ],
34
+ help: 'scene/component/polygon'
35
+ };
36
+ export default class Polygon extends Shape {
37
+ is3dish() {
38
+ return true;
39
+ }
40
+ get mutable() {
41
+ return true;
42
+ }
43
+ get pathExtendable() {
44
+ return true;
45
+ }
46
+ get path() {
47
+ return this.state.path;
48
+ }
49
+ set path(path) {
50
+ this.set('path', path);
51
+ }
52
+ contains(x, y) {
53
+ var path = this.state.path;
54
+ var result = false;
55
+ path.forEach((p, idx) => {
56
+ let j = (idx + path.length + 1) % path.length;
57
+ let x1 = p.x;
58
+ let y1 = p.y;
59
+ let x2 = path[j].x;
60
+ let y2 = path[j].y;
61
+ if (y1 > y != y2 > y && x < ((x2 - x1) * (y - y1)) / (y2 - y1) + x1)
62
+ result = !result;
63
+ });
64
+ return result;
65
+ }
66
+ get controls() {
67
+ // 폴리곤에서의 control은 새로운 path를 추가하는 포인트이다.
68
+ var path = this.path;
69
+ return path.map((p1, i) => {
70
+ let p2 = path[i + 1 >= path.length ? 0 : i + 1];
71
+ return {
72
+ x: (p1.x + p2.x) / 2,
73
+ y: (p1.y + p2.y) / 2,
74
+ handler: controlHandler
75
+ };
76
+ });
77
+ }
78
+ get nature() {
79
+ return NATURE;
80
+ }
81
+ }
82
+ Component.memoize(Polygon.prototype, 'controls', false);
83
+ Component.register('polygon', Polygon);
84
+ //# sourceMappingURL=polygon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygon.js","sourceRoot":"","sources":["../src/polygon.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport { Component, ComponentNature, DIMENSION, POSITION, Properties, RectPath, Shape } from '@hatiolab/things-scene'\n\nvar controlHandler = {\n ondragstart: function (point: POSITION, index: number, component: Component) {\n component.mutatePath(null, function (path: Array<DIMENSION>) {\n path.splice(index + 1, 0, point)\n })\n },\n\n ondragmove: function (point: POSITION, index: number, component: Component) {\n component.mutatePath(null, function (path: Array<DIMENSION>) {\n path[index + 1] = point\n })\n },\n\n ondragend: function (point: POSITION, index: number, component: Component) {}\n}\n\nconst NATURE: ComponentNature = {\n mutable: true,\n resizable: false,\n rotatable: true,\n properties: [\n {\n type: 'number',\n label: 'round',\n name: 'round',\n property: {\n min: 0,\n max: 100,\n step: 1\n }\n }\n ],\n help: 'scene/component/polygon'\n}\n\nexport default class Polygon extends Shape {\n is3dish() {\n return true\n }\n\n get mutable() {\n return true\n }\n\n get pathExtendable() {\n return true\n }\n\n get path() {\n return this.state.path\n }\n\n set path(path) {\n this.set('path', path)\n }\n\n contains(x: number, y: number) {\n var path = this.state.path as Array<DIMENSION>\n var result = false\n\n path.forEach((p, idx) => {\n let j = (idx + path.length + 1) % path.length\n\n let x1 = p.x\n let y1 = p.y\n let x2 = path[j].x\n let y2 = path[j].y\n\n if (y1 > y != y2 > y && x < ((x2 - x1) * (y - y1)) / (y2 - y1) + x1) result = !result\n })\n\n return result\n }\n\n get controls() {\n // 폴리곤에서의 control은 새로운 path를 추가하는 포인트이다.\n var path = this.path as Array<DIMENSION>\n\n return path.map((p1, i) => {\n let p2 = path[i + 1 >= path.length ? 0 : i + 1]\n\n return {\n x: (p1.x + p2.x) / 2,\n y: (p1.y + p2.y) / 2,\n handler: controlHandler\n }\n })\n }\n\n get nature() {\n return NATURE\n }\n}\n\nComponent.memoize(Polygon.prototype, 'controls', false)\n\nComponent.register('polygon', Polygon)\n"]}