DrawUtil.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. Ext.define('erp.util.DrawUtil', {
  2. draw: function(type, args){
  3. var me = this;
  4. return Ext.create('Ext.draw.Component', {
  5. viewBox: false,
  6. items: [me[type].apply(me, args)]
  7. });
  8. },
  9. batchDraw: function(data){
  10. var me = this,
  11. items = new Array();
  12. Ext.each(data, function(d){
  13. items.push(me[d.type].apply(me, d.args));
  14. });
  15. return Ext.create('Ext.draw.Component', {
  16. width: 1500,
  17. height: 2000,
  18. viewBox: false,
  19. items: items
  20. });
  21. },
  22. image: function(x, y, w, h, src, idx, handler){
  23. return {
  24. type: 'image',
  25. x: x || 0,
  26. y: y || 0,
  27. cursor: 'pointer',
  28. width: w,
  29. height: h,
  30. idx: idx,
  31. src: src,
  32. listeners: handler
  33. };
  34. },
  35. text: function(x, y, val, color, font, rotate){
  36. return {
  37. type: 'text',
  38. text: val,
  39. fill: color || 'blue',
  40. font: font || '14px Arial',
  41. cursor: 'pointer',
  42. rotate: rotate,
  43. x: x || 0,
  44. y: y || 0
  45. };
  46. },
  47. circle: function(x, y, r, color, text){
  48. var me = this,
  49. res = new Array();
  50. res.push({
  51. type: 'circle',
  52. fill: color || '#79BB3F',
  53. radius: r || 10,
  54. x: x || 0,
  55. y: y || 0
  56. });
  57. if (text) {
  58. res.push(me.text(x - text.length*14/2, y, text, null, null));
  59. }
  60. return res;
  61. },
  62. rect: function(x, y, w, h, color, text){
  63. var me = this,
  64. r = new Array();
  65. r.push({
  66. type: 'rect',
  67. width: w || 30,
  68. height: h || 30,
  69. fill: color || '#C6E2FF',
  70. x: x || 0,
  71. y: y || 0,
  72. zIndex: -3
  73. });
  74. if (text) {
  75. r.push(me.text(x + (w - text.length*14)/2, y + h/2, text, null, null));
  76. }
  77. return r;
  78. },
  79. path: function(p, color, stroke){
  80. return {
  81. type: "path",
  82. path: p,
  83. "stroke-width": "1",
  84. stroke: stroke || "#CD950C",
  85. fill: color || "gray"
  86. };
  87. },
  88. dotted: function(x, y, len, color, stroke){
  89. var p = 'M' + x + ' ' + y + ' ';
  90. for(var i = 0;i < len/3;i++) {
  91. x += 1;
  92. p += 'L' + x + ' ' + y + ' ';
  93. x += 3;
  94. p += 'M' + x + ' ' + y + ' ';
  95. }
  96. p += 'Z';
  97. return this.path(p, color, stroke);
  98. },
  99. line: function(x, y, len, angle, color, stroke, text, textAlign){//斜线
  100. if (!Ext.isNumber(angle)) {
  101. switch (angle) {
  102. case 'r' : {
  103. angle = 0;break;
  104. }
  105. case 'l' : {
  106. angle = 180;break;
  107. }
  108. case 't' : {
  109. angle = 90;break;
  110. }
  111. case 'b' : {
  112. angle = -90;break;
  113. }
  114. }
  115. }
  116. var me = this,
  117. t = me.getPointer(x, y, len, angle),
  118. a = t.x,
  119. b = t.y,
  120. p = 'M' + x + ' ' + y + ' L' + a + ' ' + b + ' Z';
  121. var r = new Array();
  122. r.push(me.path(p, color, stroke));
  123. if (text) {
  124. var l = 0,
  125. sl = me.lengthOf(text);
  126. if('center' == textAlign) {
  127. l = (len - sl)/2;
  128. } else if('right' == textAlign) {
  129. l = len;
  130. }
  131. if(sl > len) {
  132. t = me.getPointer(x, y + 10, l, angle);
  133. r.push(me.text(t.x, t.y, text.substring(0, text.length/2), color, null, {degrees: 360 - angle}));
  134. t = me.getPointer(x, y - 10, l, angle);
  135. r.push(me.text(t.x, t.y, text.substr(text.length/2 + 1), color, null, {degrees: 360 - angle}));
  136. } else {
  137. t = me.getPointer(x, y + 10, l, angle);
  138. r.push(me.text(t.x, t.y, text, color, null, {degrees: 360 - angle}));
  139. }
  140. }
  141. return r;
  142. },
  143. arrow: function(x, y, len, angle, color, stroke, text, textAlign){
  144. if (!Ext.isNumber(angle)) {
  145. switch (angle) {
  146. case 'r' : {
  147. angle = 0;break;
  148. }
  149. case 'l' : {
  150. angle = 180;break;
  151. }
  152. case 't' : {
  153. angle = 90;break;
  154. }
  155. case 'b' : {
  156. angle = -90;break;
  157. }
  158. }
  159. }
  160. var angle2 = angle - 180/len, angle3 = angle + 180/len;
  161. if (angle > 178) {
  162. angle3 -= 360;
  163. }
  164. if (angle < -178) {
  165. angle2 += 360;
  166. }
  167. var me = this,
  168. t1 = me.getPointer(x, y, len, angle),
  169. t2 = me.getPointer(x, y, len - 3, angle2),
  170. t3 = me.getPointer(x, y, len - 3, angle3),
  171. p = 'M' + x + ' ' + y + ' L' + t1.x + ' ' + t1.y +
  172. ' M' + t1.x + ' ' + t1.y + ' L' + t2.x + ' ' + t2.y +
  173. ' M' + t2.x + ' ' + t2.y + ' L' + t3.x + ' ' + t3.y +
  174. ' M' + t3.x + ' ' + t3.y + ' L' + t1.x + ' ' + t1.y + ' Z';
  175. var r = new Array();
  176. r.push(me.path(p, color, stroke));
  177. if (text) {
  178. var l = 0,
  179. sl = me.lengthOf(text);
  180. if('center' == textAlign) {
  181. l = (len - sl)/2;
  182. } else if('right' == textAlign) {
  183. l = len - sl;
  184. }
  185. if(sl > len) {
  186. t = me.getPointer(x, y + 10, l, angle);
  187. var idx = me.indexOf(text, len);
  188. r.push(me.text(t.x, t.y, text.substring(0, idx), color, null, {degrees: 360 - angle}));
  189. t = me.getPointer(x, y + 25, l, angle);
  190. r.push(me.text(t.x, t.y, text.substr(idx), color, null, {degrees: 360 - angle}));
  191. } else {
  192. t = me.getPointer(x, y + 10, l, angle);
  193. r.push(me.text(t.x, t.y, text, color, null, {degrees: 360 - angle}));
  194. }
  195. }
  196. return r;
  197. },
  198. getPointer: function(x, y, len, angle) {
  199. var a = x,b = y, xP = 0,yP = 0;
  200. if (angle >= 0 && angle < 90) {
  201. yP = Math.abs(len * Math.sin(angle*Math.PI/180));
  202. xP = Math.abs(len * Math.cos(angle*Math.PI/180));
  203. a = x + xP, b = y - yP;
  204. } else if (angle >= 90 && angle <= 180) {
  205. angle = 180 - angle;
  206. yP = Math.abs(len * Math.sin(angle*Math.PI/180));
  207. xP = Math.abs(len * Math.cos(angle*Math.PI/180));
  208. a = x - xP, b = y - yP;
  209. } else if (angle >= -90 && angle < 0) {
  210. yP = Math.abs(len * Math.sin(-angle*Math.PI/180));
  211. xP = Math.abs(len * Math.cos(-angle*Math.PI/180));
  212. a = x + xP, b = y + yP;
  213. } else if (angle >= -180 && angle < -90) {
  214. angle = 180 + angle;
  215. yP = Math.abs(len * Math.sin(angle*Math.PI/180));
  216. xP = Math.abs(len * Math.cos(angle*Math.PI/180));
  217. a = x - xP, b = y + yP;
  218. }
  219. return {x: a, y: b};
  220. },
  221. lengthOf: function(str){
  222. var byteLen = 0;
  223. if(str){
  224. for(var i=0,len = str.length; i<len; i++){
  225. if(str.charCodeAt(i) > 255){
  226. byteLen += 15;
  227. } else{
  228. byteLen += 8;
  229. }
  230. }
  231. return byteLen;
  232. } else{
  233. return 0;
  234. }
  235. },
  236. indexOf: function(str, idx){
  237. var byteLen = 0;
  238. if(str){
  239. for(var i=0,len = str.length; i<len; i++){
  240. if(str.charCodeAt(i) > 255){
  241. byteLen += 15;
  242. } else{
  243. byteLen += 8;
  244. }
  245. if(byteLen >= idx) {
  246. return i;
  247. }
  248. }
  249. return str.length - 1;
  250. } else{
  251. return 0;
  252. }
  253. }
  254. });