UIControl.js 11 KB

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