UIControl.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  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. export default class UIControl {
  17. constructor(layer) {
  18. this.layer = layer
  19. this.selectUI = null;
  20. }
  21. //点击左侧栏后,更新事件
  22. updateEventNameForSelectUI() {
  23. elementService.hideAll()
  24. //正在添加tag的时候,需要先删除
  25. const eventName = stateService.getEventName()
  26. // if (eventName == LayerEvents.AddTag) {
  27. // let item = stateService.getDraggingItem()
  28. // if (item && item.type == VectorType.Tag) {
  29. // floorplanService.deleteTag(item.vectorId)
  30. // }
  31. // }
  32. // stateService.clearItems()
  33. if (this.selectUI == UIEvents.Wall)
  34. {
  35. stateService.setEventName(LayerEvents.AddWall)
  36. }
  37. else if (this.selectUI == UIEvents.Table )
  38. {
  39. stateService.setEventName(LayerEvents.Table)
  40. }
  41. else if (this.selectUI == UIEvents.Rectangle )
  42. {
  43. stateService.setEventName(LayerEvents.Rectangle)
  44. }
  45. else if (this.selectUI == UIEvents.Circle )
  46. {
  47. stateService.setEventName(LayerEvents.Circle)
  48. }
  49. else if (this.selectUI == UIEvents.Arrow )
  50. {
  51. stateService.setEventName(LayerEvents.Arrow)
  52. }
  53. else if (this.selectUI == UIEvents.Icon )
  54. {
  55. stateService.setEventName(LayerEvents.Icon)
  56. }
  57. else if (this.selectUI == UIEvents.Tag)
  58. {
  59. stateService.setEventName(LayerEvents.AddTag)
  60. }
  61. else if (
  62. this.selectUI == UIEvents.Cigaret ||
  63. this.selectUI == UIEvents.FirePoint ||
  64. this.selectUI == UIEvents.FootPrint ||
  65. this.selectUI == UIEvents.ShoePrint ||
  66. this.selectUI == UIEvents.FingerPrint ||
  67. this.selectUI == UIEvents.DeadBody ||
  68. this.selectUI == UIEvents.BloodStain
  69. ) {
  70. stateService.setEventName(LayerEvents.AddSign)
  71. }
  72. }
  73. /**
  74. * 设置部件属性
  75. * @param {*} type 部件类型
  76. * @param {*} name 属性名称
  77. * @param {*} value 属性值
  78. */
  79. setAttributes(type, name, value) {
  80. console.log(name)
  81. let item = stateService.getFocusItem()
  82. switch (name) {
  83. case 'remove':
  84. if (type == VectorType.Wall) {
  85. floorplanService.deleteWall(item.vectorId)
  86. } else if (type == VectorType.Tag) {
  87. floorplanService.deleteTag(item.vectorId)
  88. let _item = stateService.getDraggingItem()
  89. if (_item && _item.vectorId != item.vectorId) {
  90. floorplanService.deleteTag(_item.vectorId)
  91. }
  92. } else if (type == VectorType.WallCorner) {
  93. wallService.deleteWallCorner(item.vectorId)
  94. } else if (signService.isSign(type)) {
  95. floorplanService.deleteSign(item.vectorId)
  96. }
  97. stateService.clearItems()
  98. stateService.clearEventName()
  99. this.layer.renderer.autoRedraw()
  100. break
  101. case 'angle':
  102. if (signService.isSign(type)) {
  103. let sign = floorplanService.getSign(item.vectorId)
  104. sign.angle = value
  105. this.layer.renderer.autoRedraw()
  106. }
  107. break
  108. case 'scale':
  109. if (signService.isSign(type)) {
  110. let sign = floorplanService.getSign(item.vectorId)
  111. sign.scale = value
  112. this.layer.renderer.autoRedraw()
  113. }
  114. break
  115. case 'split':
  116. if (type == VectorType.Wall || type == 'OutWall') {
  117. let wall = floorplanService.getWall(item.vectorId)
  118. let startPoint = floorplanService.getPoint(wall.start)
  119. let endPoint = floorplanService.getPoint(wall.end)
  120. let mid = {
  121. x: (startPoint.x + endPoint.x) / 2,
  122. y: (startPoint.y + endPoint.y) / 2,
  123. }
  124. let point = wallService.createPoint(mid.x, mid.y)
  125. const _wallId = wallService.splitWall(item.vectorId, point.vectorId, 'start')
  126. wall = floorplanService.getWall(item.vectorId)
  127. startPoint = floorplanService.getPoint(wall.start)
  128. endPoint = floorplanService.getPoint(wall.end)
  129. let _mid = {
  130. x: (startPoint.x + endPoint.x) / 2,
  131. y: (startPoint.y + endPoint.y) / 2,
  132. }
  133. let focusItem = {
  134. vectorId: _wallId,
  135. type: type,
  136. }
  137. if (mid.x < _mid.x) {
  138. stateService.setFocusItem(focusItem)
  139. } else if (mid.x == _mid.x && mid.y > _mid.y) {
  140. stateService.setFocusItem(focusItem)
  141. }
  142. this.layer.renderer.autoRedraw()
  143. }
  144. break
  145. case 'tag':
  146. if (type == VectorType.Tag) {
  147. let tag = floorplanService.getTag(item.vectorId)
  148. if (value != null && value.trim() != '') {
  149. tag.setTitle(value)
  150. } else {
  151. tag.setTitle(KanKan.Config.i18n('cad.input'))
  152. }
  153. //this.layer.history.save()
  154. this.layer.renderer.autoRedraw()
  155. }
  156. break
  157. }
  158. }
  159. saveAttributes(type, name) {
  160. if (name == 'compass' || (type == 'compass' && name == 'default')) {
  161. return
  162. }
  163. this.layer.history.save()
  164. }
  165. showAttributes(type) {
  166. let item = stateService.getFocusItem()
  167. if (item == null) {
  168. item = stateService.getDraggingItem()
  169. }
  170. if (item.type == VectorType.Tag) {
  171. let tag = floorplanService.getTag(item.vectorId)
  172. this.layer.$xui.currentAttributes = {
  173. name: item.type,
  174. tag: tag.title,
  175. area: tag.des,
  176. }
  177. } else if (item.type == VectorType.Wall) {
  178. let wall = floorplanService.getWall(item.vectorId)
  179. this.layer.$xui.currentAttributes = {
  180. name: wall.out ? 'OutWall' : item.type,
  181. important: wall.important || wall.out,
  182. wallType: wall.out ? 'OutWall' : item.type,
  183. }
  184. } else if (signService.isSign(item.type)) {
  185. let sign = floorplanService.getSign(item.vectorId)
  186. let scale = sign.scale
  187. this.layer.$xui.currentAttributes = {
  188. name: item.type,
  189. scale: scale,
  190. angle: sign.angle,
  191. }
  192. }
  193. }
  194. clearUI() {
  195. this.selectUI = null
  196. }
  197. getSignTypeForUI() {
  198. if (this.selectUI == UIEvents.Cigaret) {
  199. return VectorType.Cigaret
  200. } else if (this.selectUI == UIEvents.FirePoint) {
  201. return VectorType.FirePoint
  202. } else if (this.selectUI == UIEvents.FootPrint) {
  203. return VectorType.FootPrint
  204. } else if (this.selectUI == UIEvents.ShoePrint) {
  205. return VectorType.ShoePrint
  206. } else if (this.selectUI == UIEvents.FingerPrint) {
  207. return VectorType.FingerPrint
  208. } else if (this.selectUI == UIEvents.DeadBody) {
  209. return VectorType.DeadBody
  210. } else if (this.selectUI == UIEvents.BloodStain) {
  211. return VectorType.BloodStain
  212. }
  213. }
  214. //截图
  215. screenShot(styleType) {
  216. return new Promise(resolve => {
  217. this.menu_flex()
  218. stateService.clearItems()
  219. let canvas = this.layer.canvas
  220. canvas.width = window.innerWidth * Constant.ratio
  221. canvas.height = window.innerHeight * Constant.ratio
  222. coordinate.width = window.innerWidth
  223. coordinate.height = window.innerHeight
  224. coordinate.ratio = Constant.ratio
  225. let floorplanCamera = this.layer.app.core.get('CameraControls').activeControl.camera
  226. coordinate.res = Math.min(window.innerWidth / Math.abs(floorplanCamera.right - floorplanCamera.left), window.innerHeight / Math.abs(floorplanCamera.top - floorplanCamera.bottom))
  227. this.layer.renderer.autoRedrawForDownLoadImg(styleType)
  228. setTimeout(
  229. function () {
  230. let subFloor = floorplanService.getFloorNum()
  231. let file = []
  232. if (subFloor == 1) {
  233. this.downloadCadImg(canvas, 'floorPlan.jpg')
  234. } else {
  235. let currentFloor = floorplanService.getCurrentFloor()
  236. this.layer.app.store.getValue('floorcad').floors.forEach((floor, index) => {
  237. this.currentFloor = index
  238. this.layer.renderer.autoRedrawForDownLoadImg(styleType)
  239. this.downloadCadImg(canvas, floor.name + '.jpg')
  240. })
  241. this.currentFloor = currentFloor
  242. }
  243. coordinate.updateForCanvas(canvas)
  244. coordinate.setRes(floorplanCamera.left, floorplanCamera.right)
  245. coordinate.ratio = 1
  246. //this.layer.renderer.autoRedrawForDownLoadImg(styleType)
  247. this.layer.renderer.autoRedraw()
  248. resolve()
  249. }.bind(this),
  250. 100
  251. )
  252. })
  253. }
  254. downloadCadImg(canvas, filename) {
  255. // 图片导出为 jpg 格式
  256. var type = 'jpg'
  257. var imgData = canvas.toDataURL(type, 3)
  258. // 加工image data,替换mime type
  259. imgData = imgData.replace(this._fixType(type), 'image/octet-stream')
  260. // 下载后的图片名
  261. //var filename = 'cad_' + new Date().getTime() + '.' + type
  262. // download
  263. this.saveFile(imgData, filename)
  264. }
  265. saveFile(data, filename) {
  266. var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
  267. save_link.href = data
  268. save_link.download = filename
  269. var event = document.createEvent('MouseEvents')
  270. event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
  271. save_link.dispatchEvent(event)
  272. }
  273. _fixType(type) {
  274. type = type.toLowerCase().replace(/jpg/i, 'jpeg')
  275. var r = type.match(/png|jpeg|bmp|gif/)[0]
  276. return 'image/' + r
  277. }
  278. /****************************************************************************针对菜单*******************************************************************************/
  279. execute(name, value) {
  280. stateService.clearFocusItem()
  281. stateService.clearSelectItem()
  282. //this.layer.$xui.hideProps()
  283. this.layer.uiControl.currentUI = null
  284. switch (name) {
  285. case 'recall': //撤销
  286. this.menu_revoke()
  287. break
  288. case 'recover': //恢复
  289. this.menu_recovery()
  290. break
  291. case 'default': //恢复默认
  292. this.menu_default()
  293. break
  294. case 'download': //下载
  295. this.menu_screenShot(value)
  296. break
  297. case 'texture': //底图
  298. this.showTexture = value
  299. this.layer.app.dom.querySelector('.player[name="main"]').style.visibility = this.showTexture ? 'visible' : 'hidden'
  300. break
  301. case 'clear': //清空
  302. this.menu_clear()
  303. break
  304. case 'panos': //漫游点
  305. this.menu_panos(value)
  306. break
  307. case 'rotate': //旋转
  308. this.menu_rotate()
  309. break
  310. case 'flex': //适应视图
  311. this.menu_flex()
  312. break
  313. }
  314. }
  315. //撤销
  316. menu_revoke() {
  317. this.layer.revokeHistory()
  318. }
  319. //恢复
  320. menu_recovery() {
  321. this.layer.recoveryHistory()
  322. }
  323. menu_default() {
  324. historyService.clearHistoryRecord()
  325. floorplanService.setAngle(0)
  326. this.layer.load.loadFloorJson(true).then(() => {
  327. })
  328. }
  329. //截图
  330. menu_screenShot(styleType) {
  331. this.layer.stopAddVector()
  332. return this.screenShot(styleType)
  333. }
  334. //清空
  335. menu_clear() {
  336. floorplanService.clear()
  337. stateService.clearEventName()
  338. addWall.clear()
  339. elementService.hideAll()
  340. this.layer.history.save()
  341. this.layer.renderer.autoRedraw()
  342. }
  343. menu_rotate() {
  344. coordinate.reSet()
  345. let angle = floorplanService.getAngle()
  346. angle = parseFloat(angle) + Math.PI / 2
  347. if (Math.abs(angle - 2 * Math.PI) < 0.1) {
  348. angle = 0
  349. }
  350. angle = angle % 360
  351. floorplanService.setAngle(angle)
  352. //旋转三维模型
  353. let info = coordinate.getScreenInfoForCAD()
  354. info.floorPlanAngle = angle
  355. this.layer.app.store.getValue('metadata').floorPlanAngle = angle
  356. this.layer.app.core.get('CameraControls').emit('syncCadAnd3DForRotate', info)
  357. let floorplanCamera = this.layer.app.core.get('CameraControls').activeControl.camera
  358. coordinate.setRes(floorplanCamera.left, floorplanCamera.right)
  359. //修改cad数据
  360. coordinate.updateForRotate()
  361. this.layer.initPanos(floorplanService.getCurrentFloor())
  362. this.layer.history.save()
  363. this.layer.renderer.autoRedraw()
  364. }
  365. menu_flex(updateCadRes) {
  366. if (coordinate.center) {
  367. coordinate.reSet()
  368. this.layer.renderer.autoRedraw()
  369. let info = coordinate.getScreenInfoForCAD()
  370. info.floorPlanAngle = floorplanService.getAngle()
  371. this.layer.app.core.get('CameraControls').emit('syncCadAnd3D', info) // info = {width:..,height:...,center:...}
  372. if (updateCadRes) {
  373. let floorplanCamera = this.layer.app.core.get('CameraControls').activeControl.camera
  374. coordinate.setRes(floorplanCamera.left, floorplanCamera.right)
  375. }
  376. }
  377. }
  378. /******************************************************************************************************************************************************************/
  379. }