UIControl.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. import { coordinate } from '../Coordinate.js'
  2. import LayerEvents from '../enum/LayerEvents.js'
  3. import UIEvents from '../enum/UIEvents.js'
  4. import VectorType from '../enum/VectorType.js'
  5. import { stateService } from '../Service/StateService.js'
  6. import { floorplanService } from '../Service/FloorplanService.js'
  7. import { historyService } from '../Service/HistoryService.js'
  8. import { elementService } from '../Service/ElementService'
  9. import { mathUtil } from '../MathUtil.js'
  10. import { wallService } from '../Service/WallService.js'
  11. import { tagService } from '../Service/TagService.js'
  12. import { tableService } from '../Service/TableService.js'
  13. import Constant from '../Constant'
  14. import { addWall } from '../Controls/AddWall'
  15. import { floorplanData } from '../FloorplanData.js'
  16. import { signService } from '../Service/SignService.js'
  17. import mitt from 'mitt'
  18. import {history} from '../History/History.js'
  19. import { iconService } from '../Service/IconService.js'
  20. export default class UIControl{
  21. constructor(layer) {
  22. this.layer = layer
  23. this.bus = mitt()
  24. this.selectUI = null;
  25. // this.bus.emit('')
  26. }
  27. //点击左侧栏后,更新事件
  28. updateEventNameForSelectUI() {
  29. elementService.hideAll()
  30. //正在添加tag的时候,需要先删除
  31. const eventName = stateService.getEventName()
  32. // if (eventName == LayerEvents.AddTag) {
  33. // let item = stateService.getDraggingItem()
  34. // if (item && item.type == VectorType.Tag) {
  35. // floorplanService.deleteTag(item.vectorId)
  36. // }
  37. // }
  38. // stateService.clearItems()
  39. if (this.selectUI == UIEvents.Wall)
  40. {
  41. stateService.setEventName(LayerEvents.AddWall)
  42. }
  43. else if (this.selectUI == UIEvents.Table )
  44. {
  45. stateService.setEventName(LayerEvents.AddTable)
  46. }
  47. else if (this.selectUI == UIEvents.Rectangle )
  48. {
  49. stateService.setEventName(LayerEvents.AddRectangle)
  50. }
  51. else if (this.selectUI == UIEvents.Circle )
  52. {
  53. stateService.setEventName(LayerEvents.AddCircle)
  54. }
  55. else if (this.selectUI == UIEvents.Arrow )
  56. {
  57. stateService.setEventName(LayerEvents.AddArrow)
  58. }
  59. else if (this.selectUI == UIEvents.Icon )
  60. {
  61. stateService.setEventName(LayerEvents.AddIcon)
  62. }
  63. else if (this.selectUI == UIEvents.Tag)
  64. {
  65. stateService.setEventName(LayerEvents.AddTag)
  66. }
  67. else if (
  68. this.selectUI == UIEvents.Cigaret ||
  69. this.selectUI == UIEvents.FirePoint ||
  70. this.selectUI == UIEvents.LeftFootPrint ||
  71. this.selectUI == UIEvents.RightFootPrint ||
  72. this.selectUI == UIEvents.LeftShoePrint ||
  73. this.selectUI == UIEvents.RightShoePrint ||
  74. this.selectUI == UIEvents.FingerPrint ||
  75. this.selectUI == UIEvents.DeadBody ||
  76. this.selectUI == UIEvents.BloodStain
  77. ) {
  78. stateService.setEventName(LayerEvents.AddSign)
  79. }
  80. }
  81. /**
  82. * @param {*} type 部件类型
  83. * @param {*} name 属性名称
  84. * @param {*} value 属性值
  85. */
  86. setAttributes(type, name, value) {
  87. let item = stateService.getFocusItem()
  88. switch (name) {
  89. case 'delete':
  90. this.deleteItem()
  91. break;
  92. case 'update':
  93. if(type == VectorType.Tag){
  94. const tag = floorplanService.getTag(item.vectorId)
  95. tag.setValue(value)
  96. }
  97. else if(type == VectorType.Table){
  98. const table = floorplanService.getTable(item.vectorId)
  99. table.setValue(value)
  100. }
  101. else if(type == VectorType.Title){
  102. floorplanService.updateTitle(value);
  103. }
  104. else if(type == VectorType.BgImage){
  105. floorplanService.updateBgImage(value,this.layer);
  106. }
  107. else if(type == VectorType.Compass){
  108. floorplanService.updateCompass(value);
  109. }
  110. break;
  111. }
  112. history.save()
  113. stateService.clearFocusItem();
  114. this.bus.emit('hideAttribute')
  115. this.bus.emit('hideUI')
  116. this.layer.renderer.autoRedraw()
  117. }
  118. showAttributes(item) {
  119. let type = item.type;
  120. let value = null;
  121. switch (item.type) {
  122. case VectorType.Tag:
  123. const tag = floorplanService.getTag(item.vectorId)
  124. value = tag.value;
  125. break;
  126. case VectorType.Table:
  127. const table = floorplanService.getTable(item.vectorId)
  128. const cellIds = table.cells;
  129. value = [];
  130. for(let i=0;i<cellIds.length;++i){
  131. for(let j=0;j<cellIds[i].length;++j){
  132. const cell = floorplanService.getCell(cellIds[i][j])
  133. value.push({
  134. width:cell.width,
  135. height:cell.height,
  136. value:cell.value,
  137. colIndex:cell.colIndex,
  138. rowIndex:cell.rowIndex
  139. })
  140. }
  141. }
  142. break;
  143. case VectorType.Title:
  144. const title = floorplanService.getTitle()
  145. value = title.value;
  146. break;
  147. case VectorType.Compass:
  148. const compass = floorplanService.getCompass()
  149. value = compass.angle;
  150. break;
  151. }
  152. this.bus.emit('showAttribute',{
  153. type:type,
  154. value:value
  155. })
  156. }
  157. clearUI() {
  158. this.selectUI = null
  159. this.bus.emit('hideAttribute')
  160. this.bus.emit('hideUI')
  161. }
  162. deleteItem() {
  163. let item = stateService.getFocusItem()
  164. if (item) {
  165. if (item.type == VectorType.Wall) {
  166. floorplanService.deleteWall(item.vectorId)
  167. } else if (item.type == VectorType.Rectangle) {
  168. floorplanService.deleteRectangle(item.vectorId)
  169. } else if (item.type == VectorType.Circle) {
  170. floorplanService.deleteCircle(item.vectorId)
  171. } else if (item.type == VectorType.Arrow) {
  172. floorplanService.deleteArrow(item.vectorId)
  173. } else if (item.type == VectorType.Icon) {
  174. iconService.deleteIcon(item.vectorId)
  175. } else if (item.type == VectorType.Tag) {
  176. floorplanService.deleteTag(item.vectorId)
  177. } else if (item.type == VectorType.Table) {
  178. floorplanService.deleteTable(item.vectorId)
  179. } else if (signService.isSign(item.type)) {
  180. floorplanService.deleteSign(item.vectorId)
  181. } else if (item.type == VectorType.WallCorner) {
  182. wallService.deleteWallCorner(item.vectorId)
  183. }
  184. history.save()
  185. this.layer.renderer.autoRedraw()
  186. }
  187. }
  188. getSignTypeForUI() {
  189. if (this.selectUI == UIEvents.Cigaret) {
  190. return VectorType.Cigaret
  191. } else if (this.selectUI == UIEvents.FirePoint) {
  192. return VectorType.FirePoint
  193. } else if (this.selectUI == UIEvents.LeftFootPrint) {
  194. return VectorType.LeftFootPrint
  195. } else if (this.selectUI == UIEvents.RightFootPrint) {
  196. return VectorType.RightFootPrint
  197. } else if (this.selectUI == UIEvents.LeftShoePrint) {
  198. return VectorType.LeftShoePrint
  199. } else if (this.selectUI == UIEvents.RightShoePrint) {
  200. return VectorType.RightShoePrint
  201. } else if (this.selectUI == UIEvents.FingerPrint) {
  202. return VectorType.FingerPrint
  203. } else if (this.selectUI == UIEvents.DeadBody) {
  204. return VectorType.DeadBody
  205. } else if (this.selectUI == UIEvents.BloodStain) {
  206. return VectorType.BloodStain
  207. }
  208. }
  209. exportJSON() {
  210. const json = {
  211. version: floorplanData.version,
  212. floors: floorplanData.floors,
  213. currentId: floorplanService.getCurrentId(),
  214. }
  215. return json
  216. }
  217. downloadCadImg(canvas, filename) {
  218. // 图片导出为 png 格式
  219. var type = 'png'
  220. var imgData = canvas.toDataURL(type, 1)
  221. let blobImg = this.base64ToBlob(imgData)
  222. return blobImg
  223. // 加工image data,替换mime type
  224. //imgData = imgData.replace(this._fixType(type), 'image/octet-stream')
  225. // download
  226. //this.saveFile(imgData, filename)
  227. }
  228. saveFile(data, filename) {
  229. var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
  230. save_link.href = data
  231. save_link.download = filename
  232. var event = document.createEvent('MouseEvents')
  233. event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
  234. save_link.dispatchEvent(event)
  235. }
  236. _fixType(type) {
  237. type = type.toLowerCase().replace(/jpg/i, 'jpeg')
  238. var r = type.match(/png|jpeg|bmp|gif/)[0]
  239. return 'image/' + r
  240. }
  241. base64ToBlob(base64) {
  242. let arr = base64.split(','),
  243. mime = arr[0].match(/:(.*?);/)[1],
  244. bstr = atob(arr[1]),
  245. n = bstr.length,
  246. u8arr = new Uint8Array(n)
  247. while (n--) {
  248. u8arr[n] = bstr.charCodeAt(n)
  249. }
  250. return new Blob([u8arr], { type: mime })
  251. }
  252. //截图
  253. menu_screenShot(fileName) {
  254. // this.menu_flex();
  255. // this.layer.stopAddVector()
  256. // setTimeout(function(){
  257. // this.downloadCadImg(this.layer.canvas,fileName)
  258. // }.bind(this),100)
  259. this.layer.stopAddVector()
  260. return this.downloadCadImg(this.layer.canvas,fileName)
  261. }
  262. menu_flex() {
  263. coordinate.reSet()
  264. this.layer.renderer.autoRedraw()
  265. }
  266. initTopTable(value){
  267. let center = {
  268. x:770,
  269. y:200
  270. }
  271. center = coordinate.getXYFromScreen(center)
  272. let table = tableService.createTable(center)
  273. table.setValue(value)
  274. this.layer.renderer.autoRedraw()
  275. }
  276. initDownTable(value){
  277. let center = {
  278. x:770,
  279. y:520
  280. }
  281. center = coordinate.getXYFromScreen(center)
  282. let table = tableService.createTable(center)
  283. table.setValue(value)
  284. this.layer.renderer.autoRedraw()
  285. }
  286. /******************************************************************************************************************************************************************/
  287. }