openatc-components 0.0.111 → 0.1.0

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 (383) hide show
  1. package/.babelrc +18 -18
  2. package/.editorconfig +9 -9
  3. package/.eslintignore +5 -5
  4. package/.eslintrc.js +29 -29
  5. package/.postcssrc.js +10 -10
  6. package/README.md +30 -30
  7. package/build/build.js +41 -41
  8. package/build/check-versions.js +54 -54
  9. package/build/package.config.js +58 -58
  10. package/build/package.dev.config.js +107 -107
  11. package/build/package.prod.config.js +160 -160
  12. package/build/utils.js +101 -101
  13. package/build/vue-loader.conf.js +22 -22
  14. package/build/webpack.base.conf.js +114 -114
  15. package/build/webpack.dev.conf.js +95 -95
  16. package/build/webpack.prod.conf.js +149 -149
  17. package/config/dev.env.js +8 -8
  18. package/config/index.js +91 -91
  19. package/config/prod.env.js +5 -5
  20. package/config/test.env.js +7 -7
  21. package/index.html +12 -12
  22. package/package/kisscomps/components/BoardCard/BoardCard.vue +94 -94
  23. package/package/kisscomps/components/BoardCard/index.js +2 -2
  24. package/package/kisscomps/components/Channelization/Channelization.vue +544 -544
  25. package/package/kisscomps/components/Channelization/index.js +2 -2
  26. package/package/kisscomps/components/ChannelizationFlowStatistic/ChannelizationFlowStatistic.vue +349 -349
  27. package/package/kisscomps/components/ChannelizationFlowStatistic/index.js +2 -2
  28. package/package/kisscomps/components/ChannelizationWithInterface/ChannelizationWithInterface.vue +494 -494
  29. package/package/kisscomps/components/ChannelizationWithInterface/index.js +2 -2
  30. package/package/kisscomps/components/CommonKanban/CommonKanban.vue +118 -118
  31. package/package/kisscomps/components/CommonKanban/index.js +2 -2
  32. package/package/kisscomps/components/DrawChannelization/drawsvg/basicCoordInfo.vue +113 -113
  33. package/package/kisscomps/components/DrawChannelization/drawsvg/channelizationElements.vue +255 -255
  34. package/package/kisscomps/components/DrawChannelization/drawsvg/detectorAssociatedComponent.vue +152 -152
  35. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/TextBox.vue +91 -91
  36. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/crossMap.vue +194 -194
  37. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/editText.vue +108 -108
  38. package/package/kisscomps/components/DrawChannelization/drawsvg/firstImportCrossmap.vue +51 -51
  39. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/countdownSvg.vue +224 -224
  40. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorChart.vue +247 -247
  41. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorIconSvg.vue +210 -210
  42. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/laneIcon.vue +72 -72
  43. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +455 -455
  44. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/pedroadIconSvg.vue +219 -219
  45. package/package/kisscomps/components/DrawChannelization/drawsvg/importDialog.vue +74 -74
  46. package/package/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +989 -989
  47. package/package/kisscomps/components/DrawChannelization/drawsvg/index.vue +110 -110
  48. package/package/kisscomps/components/DrawChannelization/drawsvg/laneEditPanel.vue +666 -666
  49. package/package/kisscomps/components/DrawChannelization/drawsvg/overlapAssociatedComponent.vue +157 -157
  50. package/package/kisscomps/components/DrawChannelization/drawsvg/phaseAssociatedComponent.vue +157 -157
  51. package/package/kisscomps/components/DrawChannelization/drawsvg/table.vue +99 -99
  52. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/loadutils.js +87 -87
  53. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/phaseDataModel.js +32 -32
  54. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/phasePos.json +20 -20
  55. package/package/kisscomps/components/DrawChannelization/index.js +2 -2
  56. package/package/kisscomps/components/DrawChannelization/phaseDataMgr.js +278 -278
  57. package/package/kisscomps/components/ExpendConfig/ExpendConfig.vue +114 -114
  58. package/package/kisscomps/components/ExpendConfig/index.js +2 -2
  59. package/package/kisscomps/components/FaultDetailModal/FaultDetailModal.vue +170 -170
  60. package/package/kisscomps/components/FaultDetailModal/index.js +2 -2
  61. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/CrossRoadsSvg.vue +497 -497
  62. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/CustomRoadsSvg.vue +46 -46
  63. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionEWSvg.vue +300 -300
  64. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionSNSvg.vue +288 -288
  65. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampEastSvg.vue +391 -391
  66. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampNorthSvg.vue +336 -336
  67. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampSouthSvg.vue +345 -345
  68. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampWestSvg.vue +389 -389
  69. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkSvg.vue +1179 -1179
  70. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeEastRoadsSvg.vue +402 -402
  71. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeNorthRoadsSvg.vue +361 -361
  72. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeSouthRoadsSvg.vue +368 -368
  73. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeWestRoadsSvg.vue +475 -475
  74. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LCrossRoadsSvg.vue +494 -494
  75. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeEastRoadsSvg.vue +401 -401
  76. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeNorthRoadsSvg.vue +360 -360
  77. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeSouthRoadsSvg.vue +367 -367
  78. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeWestRoadsSvg.vue +476 -476
  79. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/refreshSvg.vue +63 -63
  80. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/busMapSvg.vue +50 -50
  81. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/eastBusSvg.vue +167 -167
  82. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/northBusSvg.vue +168 -168
  83. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/southBusSvg.vue +168 -168
  84. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/westBusSvg.vue +169 -169
  85. package/package/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +913 -912
  86. package/package/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/LphaseIconSvg.vue +112 -112
  87. package/package/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/phaseIconSvg.vue +112 -112
  88. package/package/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/rampPhaseIconSvg.vue +111 -111
  89. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.json +196 -196
  90. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.left.json +196 -196
  91. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.json +99 -99
  92. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.left.json +99 -99
  93. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/rampPos.json +52 -52
  94. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/sidePos.json +99 -99
  95. package/package/kisscomps/components/IntersectionMap/crossDirection/utils.js +78 -78
  96. package/package/kisscomps/components/IntersectionMap/index.js +2 -2
  97. package/package/kisscomps/components/IntersectionMap/intersectionmap.vue +154 -154
  98. package/package/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +518 -518
  99. package/package/kisscomps/components/IntersectionWithInterface/index.js +2 -2
  100. package/package/kisscomps/components/KanBan/index.js +2 -2
  101. package/package/kisscomps/components/KanBan/kanban.vue +219 -219
  102. package/package/kisscomps/components/MessageBox/index.vue +96 -96
  103. package/package/kisscomps/components/OverLap/OverLap.vue +207 -207
  104. package/package/kisscomps/components/OverLap/index.js +2 -2
  105. package/package/kisscomps/components/PatternStatus/PatternStatus.vue +962 -962
  106. package/package/kisscomps/components/PatternStatus/index.js +2 -2
  107. package/package/kisscomps/components/PatternWalkSvg/PatternWalkSvg.vue +423 -423
  108. package/package/kisscomps/components/PatternWalkSvg/index.js +2 -2
  109. package/package/kisscomps/components/PhaseMarker/index.js +6 -6
  110. package/package/kisscomps/components/PhaseMarker/phasemarker.vue +215 -215
  111. package/package/kisscomps/components/PhaseMarker/svg/patternSvg.vue +121 -121
  112. package/package/kisscomps/components/PhaseMarker/svg/phase.vue +60 -60
  113. package/package/kisscomps/components/PhaseMarker/svg/phaseCount.vue +62 -62
  114. package/package/kisscomps/components/PhaseMarker/svg/phaseCountCycle.vue +62 -62
  115. package/package/kisscomps/components/PhaseMarker/svg/phaseSvg.vue +117 -117
  116. package/package/kisscomps/components/SchemeConfig/SchemeConfig.vue +760 -760
  117. package/package/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +195 -195
  118. package/package/kisscomps/components/SchemeConfig/index.js +2 -2
  119. package/package/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +198 -198
  120. package/package/kisscomps/components/SchemeConfig/manualControlModal/index.vue +219 -219
  121. package/package/kisscomps/components/SchemeConfig/priorityControl/index.vue +190 -190
  122. package/package/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  123. package/package/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +263 -263
  124. package/package/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +1387 -1387
  125. package/package/kisscomps/components/StageBord/StageBord.vue +242 -242
  126. package/package/kisscomps/components/StageBord/index.js +2 -2
  127. package/package/kisscomps/components/StageStatus/StageStatus.vue +310 -310
  128. package/package/kisscomps/components/StageStatus/index.js +2 -2
  129. package/package/kisscomps/components/Stages/index.vue +139 -139
  130. package/package/kisscomps/components/SvgIcon/SvgIcon.vue +53 -53
  131. package/package/kisscomps/components/SvgIcon/index.js +2 -2
  132. package/package/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +522 -522
  133. package/package/kisscomps/components/XRDDirSelector/index.js +2 -2
  134. package/package/kisscomps/components/overView/index.vue +679 -676
  135. package/package/kisscomps/components/patternList/index.js +2 -2
  136. package/package/kisscomps/components/patternList/patternList.vue +567 -567
  137. package/package/kisscomps/index.js +106 -106
  138. package/package/kissui.min.js +1 -1
  139. package/package.json +124 -124
  140. package/src/App.vue +24 -24
  141. package/src/EdgeMgr/EdgeModelBase.js +16 -16
  142. package/src/EdgeMgr/controller/crossDiagramMgr.js +120 -120
  143. package/src/api/authapi.js +31 -31
  144. package/src/api/config.js +21 -21
  145. package/src/api/control.js +76 -76
  146. package/src/api/cross.js +33 -33
  147. package/src/api/fault.js +66 -66
  148. package/src/api/index.js +24 -24
  149. package/src/api/login.js +46 -46
  150. package/src/api/optimize.js +72 -72
  151. package/src/api/param.js +154 -154
  152. package/src/api/passwdAssest.js +101 -101
  153. package/src/api/template.js +27 -27
  154. package/src/i18n/index.js +26 -26
  155. package/src/i18n/language/en.js +1225 -1218
  156. package/src/i18n/language/index.js +25 -25
  157. package/src/i18n/language/zh.js +1224 -1217
  158. package/src/icons/demo.css +539 -539
  159. package/src/icons/iconfont.css +835 -835
  160. package/src/icons/iconfont.json +1444 -1444
  161. package/src/icons/index.js +20 -20
  162. package/src/icons/svg/bendi.svg +110 -110
  163. package/src/icons/svg/bujin.svg +36 -36
  164. package/src/icons/svg/connectBlue.svg +7 -7
  165. package/src/icons/svg/currentvolume.svg +0 -0
  166. package/src/icons/svg/custom-BRTlane.svg +40 -40
  167. package/src/icons/svg/custom-buslane.svg +40 -40
  168. package/src/icons/svg/custom-detector.svg +12 -12
  169. package/src/icons/svg/custom-east-bottom.svg +32 -32
  170. package/src/icons/svg/custom-east-top.svg +32 -32
  171. package/src/icons/svg/custom-ewped.svg +35 -35
  172. package/src/icons/svg/custom-nonmotorizedlane.svg +40 -40
  173. package/src/icons/svg/custom-north-left.svg +32 -32
  174. package/src/icons/svg/custom-north-right.svg +32 -32
  175. package/src/icons/svg/custom-peddetector.svg +17 -17
  176. package/src/icons/svg/custom-snped.svg +35 -35
  177. package/src/icons/svg/custom-south-left.svg +32 -32
  178. package/src/icons/svg/custom-south-right.svg +32 -32
  179. package/src/icons/svg/custom-tramlane.svg +40 -40
  180. package/src/icons/svg/custom-vehiclebranch.svg +40 -40
  181. package/src/icons/svg/custom-vehiclemainroad.svg +41 -41
  182. package/src/icons/svg/custom-west-bottom.svg +32 -32
  183. package/src/icons/svg/custom-west-top.svg +32 -32
  184. package/src/icons/svg/custom-xlped.svg +14 -14
  185. package/src/icons/svg/custom-xrped.svg +14 -14
  186. package/src/icons/svg/cutRed.svg +7 -7
  187. package/src/icons/svg/cycle.svg +0 -0
  188. package/src/icons/svg/dingzhouqi.svg +34 -34
  189. package/src/icons/svg/ganyingkongzhi.svg +30 -30
  190. package/src/icons/svg/guandeng.svg +81 -81
  191. package/src/icons/svg/huangshan.svg +71 -71
  192. package/src/icons/svg/maincontrol.svg +0 -0
  193. package/src/icons/svg/manualcontrolbackground.svg +51 -51
  194. package/src/icons/svg/manualcontrolbackground1.svg +62 -62
  195. package/src/icons/svg/manualcontrolbackgrounden.svg +62 -62
  196. package/src/icons/svg/model.svg +0 -0
  197. package/src/icons/svg/phasediff.svg +0 -0
  198. package/src/icons/svg/quanhong.svg +86 -86
  199. package/src/icons/svg/shanghe.svg +11 -11
  200. package/src/icons/svg/shoudong.svg +103 -103
  201. package/src/icons/svg/time.svg +0 -0
  202. package/src/icons/svg/wuxianlan.svg +46 -46
  203. package/src/icons/svg/xiala.svg +11 -11
  204. package/src/icons/svg/xingrenguojie.svg +33 -33
  205. package/src/icons/svg/xitong.svg +89 -89
  206. package/src/icons/svg/youxian.svg +41 -41
  207. package/src/icons/svg/zizhukongzhi.svg +43 -43
  208. package/src/kisscomps/components/BoardCard/BoardCard.vue +94 -94
  209. package/src/kisscomps/components/BoardCard/index.js +2 -2
  210. package/src/kisscomps/components/Channelization/Channelization.vue +544 -544
  211. package/src/kisscomps/components/Channelization/index.js +2 -2
  212. package/src/kisscomps/components/ChannelizationFlowStatistic/ChannelizationFlowStatistic.vue +349 -349
  213. package/src/kisscomps/components/ChannelizationFlowStatistic/index.js +2 -2
  214. package/src/kisscomps/components/ChannelizationWithInterface/ChannelizationWithInterface.vue +494 -494
  215. package/src/kisscomps/components/ChannelizationWithInterface/index.js +2 -2
  216. package/src/kisscomps/components/CommonKanban/CommonKanban.vue +118 -118
  217. package/src/kisscomps/components/CommonKanban/index.js +2 -2
  218. package/src/kisscomps/components/DrawChannelization/drawsvg/basicCoordInfo.vue +113 -113
  219. package/src/kisscomps/components/DrawChannelization/drawsvg/channelizationElements.vue +255 -255
  220. package/src/kisscomps/components/DrawChannelization/drawsvg/detectorAssociatedComponent.vue +152 -152
  221. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/TextBox.vue +91 -91
  222. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/crossMap.vue +194 -194
  223. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/editText.vue +108 -108
  224. package/src/kisscomps/components/DrawChannelization/drawsvg/firstImportCrossmap.vue +51 -51
  225. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/countdownSvg.vue +224 -224
  226. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorChart.vue +247 -247
  227. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorIconSvg.vue +210 -210
  228. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/laneIcon.vue +72 -72
  229. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +455 -455
  230. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/pedroadIconSvg.vue +219 -219
  231. package/src/kisscomps/components/DrawChannelization/drawsvg/importDialog.vue +74 -74
  232. package/src/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +989 -989
  233. package/src/kisscomps/components/DrawChannelization/drawsvg/index.vue +110 -110
  234. package/src/kisscomps/components/DrawChannelization/drawsvg/laneEditPanel.vue +666 -666
  235. package/src/kisscomps/components/DrawChannelization/drawsvg/overlapAssociatedComponent.vue +157 -157
  236. package/src/kisscomps/components/DrawChannelization/drawsvg/phaseAssociatedComponent.vue +157 -157
  237. package/src/kisscomps/components/DrawChannelization/drawsvg/table.vue +99 -99
  238. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/loadutils.js +87 -87
  239. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phaseDataModel.js +32 -32
  240. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phasePos.json +20 -20
  241. package/src/kisscomps/components/DrawChannelization/index.js +2 -2
  242. package/src/kisscomps/components/DrawChannelization/phaseDataMgr.js +278 -278
  243. package/src/kisscomps/components/ExpendConfig/ExpendConfig.vue +114 -114
  244. package/src/kisscomps/components/ExpendConfig/index.js +2 -2
  245. package/src/kisscomps/components/FaultDetailModal/FaultDetailModal.vue +170 -170
  246. package/src/kisscomps/components/FaultDetailModal/index.js +2 -2
  247. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CrossRoadsSvg.vue +497 -497
  248. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CustomRoadsSvg.vue +46 -46
  249. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionEWSvg.vue +300 -300
  250. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionSNSvg.vue +288 -288
  251. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampEastSvg.vue +391 -391
  252. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampNorthSvg.vue +336 -336
  253. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampSouthSvg.vue +345 -345
  254. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampWestSvg.vue +389 -389
  255. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkSvg.vue +1179 -1179
  256. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeEastRoadsSvg.vue +402 -402
  257. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeNorthRoadsSvg.vue +361 -361
  258. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeSouthRoadsSvg.vue +368 -368
  259. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeWestRoadsSvg.vue +475 -475
  260. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LCrossRoadsSvg.vue +494 -494
  261. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeEastRoadsSvg.vue +401 -401
  262. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeNorthRoadsSvg.vue +360 -360
  263. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeSouthRoadsSvg.vue +367 -367
  264. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeWestRoadsSvg.vue +476 -476
  265. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/refreshSvg.vue +63 -63
  266. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/busMapSvg.vue +50 -50
  267. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/eastBusSvg.vue +167 -167
  268. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/northBusSvg.vue +168 -168
  269. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/southBusSvg.vue +168 -168
  270. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/westBusSvg.vue +169 -169
  271. package/src/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +913 -912
  272. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/LphaseIconSvg.vue +112 -112
  273. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/phaseIconSvg.vue +112 -112
  274. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/rampPhaseIconSvg.vue +111 -111
  275. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.json +196 -196
  276. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.left.json +196 -196
  277. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.json +99 -99
  278. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.left.json +99 -99
  279. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/rampPos.json +52 -52
  280. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/sidePos.json +99 -99
  281. package/src/kisscomps/components/IntersectionMap/crossDirection/utils.js +78 -78
  282. package/src/kisscomps/components/IntersectionMap/index.js +2 -2
  283. package/src/kisscomps/components/IntersectionMap/intersectionmap.vue +154 -154
  284. package/src/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +518 -518
  285. package/src/kisscomps/components/IntersectionWithInterface/index.js +2 -2
  286. package/src/kisscomps/components/KanBan/index.js +2 -2
  287. package/src/kisscomps/components/KanBan/kanban.vue +219 -219
  288. package/src/kisscomps/components/MessageBox/index.vue +96 -96
  289. package/src/kisscomps/components/OverLap/OverLap.vue +207 -207
  290. package/src/kisscomps/components/OverLap/index.js +2 -2
  291. package/src/kisscomps/components/PatternStatus/PatternStatus.vue +962 -962
  292. package/src/kisscomps/components/PatternStatus/index.js +2 -2
  293. package/src/kisscomps/components/PatternWalkSvg/PatternWalkSvg.vue +423 -423
  294. package/src/kisscomps/components/PatternWalkSvg/index.js +2 -2
  295. package/src/kisscomps/components/PhaseMarker/index.js +6 -6
  296. package/src/kisscomps/components/PhaseMarker/phasemarker.vue +215 -215
  297. package/src/kisscomps/components/PhaseMarker/svg/patternSvg.vue +121 -121
  298. package/src/kisscomps/components/PhaseMarker/svg/phase.vue +60 -60
  299. package/src/kisscomps/components/PhaseMarker/svg/phaseCount.vue +62 -62
  300. package/src/kisscomps/components/PhaseMarker/svg/phaseCountCycle.vue +62 -62
  301. package/src/kisscomps/components/PhaseMarker/svg/phaseSvg.vue +117 -117
  302. package/src/kisscomps/components/SchemeConfig/SchemeConfig.vue +760 -760
  303. package/src/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +195 -195
  304. package/src/kisscomps/components/SchemeConfig/index.js +2 -2
  305. package/src/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +198 -198
  306. package/src/kisscomps/components/SchemeConfig/manualControlModal/index.vue +219 -219
  307. package/src/kisscomps/components/SchemeConfig/priorityControl/index.vue +190 -190
  308. package/src/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  309. package/src/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +263 -263
  310. package/src/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +1387 -1387
  311. package/src/kisscomps/components/StageBord/StageBord.vue +242 -242
  312. package/src/kisscomps/components/StageBord/index.js +2 -2
  313. package/src/kisscomps/components/StageStatus/StageStatus.vue +310 -310
  314. package/src/kisscomps/components/StageStatus/index.js +2 -2
  315. package/src/kisscomps/components/Stages/index.vue +139 -139
  316. package/src/kisscomps/components/SvgIcon/SvgIcon.vue +53 -53
  317. package/src/kisscomps/components/SvgIcon/index.js +2 -2
  318. package/src/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +522 -522
  319. package/src/kisscomps/components/XRDDirSelector/index.js +2 -2
  320. package/src/kisscomps/components/overView/index.vue +679 -676
  321. package/src/kisscomps/components/patternList/index.js +2 -2
  322. package/src/kisscomps/components/patternList/patternList.vue +567 -567
  323. package/src/kisscomps/index.js +106 -106
  324. package/src/lib/publicjs/ArryListUtil.js +38 -38
  325. package/src/lib/publicjs/HttpurlMgr.js +45 -45
  326. package/src/lib/publicjs/KissApi.js +158 -158
  327. package/src/lib/publicjs/KissWSSub/Heartcheck.js +128 -128
  328. package/src/lib/publicjs/KissWSSub/KissWsSub.js +91 -91
  329. package/src/lib/publicjs/KissWSSub/KissWsSubByType.js +152 -152
  330. package/src/lib/publicjs/KissWSSub/SimuWsSubByType.js +44 -44
  331. package/src/lib/publicjs/KissWSSub/Sub.js +51 -51
  332. package/src/lib/publicjs/KissWSSub/SubChannel.js +119 -119
  333. package/src/lib/publicjs/basecomponents.js +65 -65
  334. package/src/lib/publicjs/localStorage.js +112 -112
  335. package/src/lib/publicjs/objdeepcopy.js +32 -32
  336. package/src/lib/publicjs/pageScroll.js +30 -30
  337. package/src/lib/publicjs/passwdAssest.js +101 -101
  338. package/src/lib/publicjs/styleclassfactory.js +32 -32
  339. package/src/main.js +50 -50
  340. package/src/router/index.js +42 -42
  341. package/src/store/getters.js +16 -16
  342. package/src/store/index.js +26 -26
  343. package/src/store/modules/globalParam.js +67 -67
  344. package/src/utils/ControlFormat.js +68 -68
  345. package/src/utils/RingDataModel.js +191 -191
  346. package/src/utils/auth.js +111 -111
  347. package/src/utils/dateFormat.js +41 -41
  348. package/src/utils/errorcode.js +224 -224
  349. package/src/utils/fault.js +195 -195
  350. package/src/utils/faultcode.js +209 -209
  351. package/src/utils/index.js +69 -69
  352. package/src/utils/pedphasedesc.js +119 -119
  353. package/src/utils/phasedesc.js +124 -124
  354. package/src/utils/responseMessage.js +21 -21
  355. package/src/utils/validate.js +43 -43
  356. package/src/views/customchannelization.vue +49 -49
  357. package/src/views/home.1.vue +479 -479
  358. package/src/views/home.vue +78 -78
  359. package/src/views/intersection.vue +308 -308
  360. package/src/views/overView.vue +41 -41
  361. package/src/views/schemeconfig.vue +165 -154
  362. package/static/apiconfig.json +351 -351
  363. package/static/styles/channelizatioon.scss +414 -414
  364. package/static/styles/common.scss +20 -20
  365. package/static/styles/commonkanban.scss +87 -87
  366. package/static/styles/dark/index.scss +2 -2
  367. package/static/styles/dark/theme/element-dark.scss +42 -42
  368. package/static/styles/index.scss +84 -84
  369. package/static/styles/intersection.scss +170 -170
  370. package/static/styles/light/index.scss +2 -2
  371. package/static/styles/light/theme/element-light.scss +42 -42
  372. package/static/styles/overview.scss +371 -371
  373. package/static/styles/schemeconfig.scss +457 -457
  374. package/static/styles/stages.scss +64 -64
  375. package/static/token.json +2 -2
  376. package/test/e2e/custom-assertions/elementCount.js +27 -27
  377. package/test/e2e/nightwatch.conf.js +46 -46
  378. package/test/e2e/runner.js +48 -48
  379. package/test/e2e/specs/test.js +19 -19
  380. package/test/unit/.eslintrc +7 -7
  381. package/test/unit/jest.conf.js +30 -30
  382. package/test/unit/setup.js +3 -3
  383. package/test/unit/specs/HelloWorld.spec.js +11 -11
@@ -1,989 +1,989 @@
1
- /**
2
- * Copyright (c) 2020 kedacom
3
- * OpenATC is licensed under Mulan PSL v2.
4
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
5
- * You may obtain a copy of Mulan PSL v2 at:
6
- * http://license.coscl.org.cn/MulanPSL2
7
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
- * See the Mulan PSL v2 for more details.
11
- **/
12
- <!--渠化绘制功能-->
13
- <template>
14
- <div class="custom-cross" v-if="visible">
15
- <ImportDialog ref="importDialog" @loadSvgString="loadSvgString" @loadMapSize="loadMapSize" />
16
- <Messagebox :visible="canclesettingvisible" :text="$t('openatccomponents.channelizationmap.canclesetting')" @cancle="cancleSetting" @ok="completeSetting"/>
17
- <div class="custom-main" ref="custommain">
18
- <div class="custom-group drawPanelAnimation" ref="customGroup">
19
- <!-- 绘制功能 -->
20
- <div class="draw-function">
21
- <div class="again-import">
22
- <span class="import-label">{{$t('openatccomponents.channelizationmap.importcrosspicture')}}</span>
23
- <el-button
24
- class="again-import-btn"
25
- type="primary"
26
- :disabled="!isSeletable"
27
- @click="clickOpen"
28
- >{{$t('openatccomponents.channelizationmap.againimport')}}</el-button>
29
- <i class="lock-map el-icon-unlock" v-if="isLockedCrossMap" @click="handleLockCrossMap()"></i>
30
- <i class="lock-map el-icon-lock" v-if="!isLockedCrossMap" @click="handleLockCrossMap()"></i>
31
- </div>
32
-
33
- <div class="draw-to-sketchpad">
34
- <div class="drawtip">{{$t('openatccomponents.channelizationmap.drawtips')}}</div>
35
- <div class="draw-operation">
36
- <!-- <el-button
37
- type="primary"
38
- :disabled="!isSeletable"
39
- @click="addText"
40
- >添加text</el-button>-->
41
- <el-button
42
- v-for="editbtn in editBtnGroup"
43
- :key="editbtn.type"
44
- class="edit-icon-btn"
45
- @click="handleAddIcon(editbtn)"
46
- >
47
- <LaneIconSvg :laneicon="editbtn"/>
48
- <div
49
- class="btn-label"
50
- :class="{'highlightColor': editbtn.active === true, 'defaultColor': editbtn.active === false}"
51
- >{{editbtn.label}}</div>
52
- </el-button>
53
- </div>
54
- </div>
55
- </div>
56
- <!-- 画板区域 -->
57
- <div class="sketchpad-area" id="sketchpadgroup" ref="sketchpadgroup">
58
- <ChannelizationElements
59
- id="channelizationElements"
60
- :allitem="allitem"
61
- :CrossMapVisible="CrossMapVisible"
62
- :CrossMapData="CrossMapData"
63
- :isSeletable="isSeletable"
64
- :pointchange="pointchange"
65
- @changeCrossMap="changeCrossMap"
66
- :Motorways="Motorways"
67
- :curChooseIconIndex="curChooseIconIndex"
68
- @changeMotorwayItem="changeMotorwayItem"
69
- @handleSelectIcon="handleSelectIcon"
70
- :Countdown="Countdown"
71
- :CountdownList="phaseCountdownMock"
72
- @changeTimeItem="changeTimeItem"
73
- :Pedwalk="Pedwalk"
74
- @changePedItem="changePedItem"
75
- :Detector="Detector"
76
- @changeDetectorItem="changeDetectorItem"
77
- :DetectorChart="DetectorChart"
78
- :CurChooseIcon="curChooseIcon"
79
- @changeDetectorChartItem="changeDetectorChartItem"
80
- :isLockedCrossMap="isLockedCrossMap"
81
- />
82
- </div>
83
- <div class="draw-end-function">
84
- <el-button type="primary" @click="handleReset()">{{$t('openatccomponents.button.reset')}}</el-button>
85
- <!-- <el-button type="primary" @click="cancledraw()">{{$t('openatccomponents.button.Cancel')}}</el-button> -->
86
- <el-button type="primary" @click="savedraw()">{{$t('openatccomponents.button.save')}}</el-button>
87
- <el-button type="primary" @click="importFromFile()">{{$t('openatccomponents.main.import')}}</el-button>
88
- <el-button type="primary" @click="exportToFile()">{{$t('openatccomponents.main.export')}}</el-button>
89
- </div>
90
- </div>
91
- <div class="custom-edit" ref="customEdit">
92
- <LaneEditPanel
93
- :Data="curChooseIcon"
94
- :choosedirections="curChooseIcon.direction"
95
- :Motorways="Motorways"
96
- @handleChooseDire="handleChooseDire"
97
- @handleChoosePed="handleChoosePed"
98
- @deleteItem="deleteItem"
99
- @cloneItem="cloneItem"
100
- @changeIconDataByType="changeIconDataByType"
101
- @handleDisassociatePhase="handleDisassociatePhase"
102
- />
103
- </div>
104
- </div>
105
- <!-- <el-row>
106
- <div class="phase-table">
107
- <PhaseTable
108
- :customlist="customlist"
109
- @changeText="changeText"
110
- @deleteItem="deleteItem"
111
- @changeMotorwayItem="changeMotorwayItem"
112
- @changeIconDataByType="changeIconDataByType"
113
- />
114
- </div>
115
- </el-row> -->
116
- <!-- 从文件导入弹窗 -->
117
- <el-dialog
118
- :title="$t('openatccomponents.main.tip')"
119
- :visible.sync="dialogVisible"
120
- width="30%"
121
- >
122
- <input
123
- type="file"
124
- id="file"
125
- />
126
- <span
127
- slot="footer"
128
- class="dialog-footer"
129
- >
130
- <el-button @click="dialogVisible = false">{{$t('openatccomponents.common.cancel')}}</el-button>
131
- <el-button
132
- type="primary"
133
- @click="readAsText"
134
- >{{$t('openatccomponents.common.confirm')}}</el-button>
135
- </span>
136
- </el-dialog>
137
- </div>
138
- </template>
139
-
140
- <script>
141
- import ChannelizationElements from './channelizationElements'
142
-
143
- import LaneEditPanel from './laneEditPanel'
144
-
145
- import PhaseTable from './table'
146
- import PhaseDataModel from './utils/phaseDataModel.js'
147
- import LaneIconSvg from './iconSvg/laneIcon'
148
-
149
- import ImportDialog from './importDialog'
150
- import Messagebox from '../../MessageBox/index'
151
-
152
- import { mapState } from 'vuex'
153
-
154
- import { saveChannelizatonChart } from '../../../../api/cross'
155
- import { getMessageByCode } from '../../../../utils/responseMessage.js'
156
-
157
- export default {
158
- name: 'draw-channelization',
159
- components: {
160
- Messagebox,
161
- ImportDialog,
162
- ChannelizationElements,
163
- PhaseTable,
164
- LaneIconSvg,
165
- LaneEditPanel
166
- },
167
- computed: {
168
- ...mapState({
169
- phaseList: state => state.globalParam.tscParam.phaseList
170
- })
171
- },
172
- props: {
173
- loadedChannelizatonData: {
174
- type: Object
175
- },
176
- AgentId: {
177
- type: String,
178
- default: '0'
179
- }
180
- },
181
- watch: {
182
- AgentId: {
183
- handler: function (val) {
184
- // 平台设备切换时,清空上一个渠化配置
185
- this.handleReset()
186
- },
187
- deep: true
188
- },
189
- loadedChannelizatonData: {
190
- handler: function (val) {
191
- // 平台设备切换时,重载当前路口保存的渠化配置
192
- this.LoadedChannelizatonData = JSON.parse(JSON.stringify(val))
193
- this.load('all')
194
- },
195
- deep: true
196
- }
197
- },
198
- data () {
199
- return {
200
- visible: true,
201
- canclesettingvisible: false,
202
-
203
- isSeletable: true, // 元素是否可以编辑
204
- index: 0,
205
- motorid: 1, // 车道id
206
- pedid: 1, // 人行道id
207
- detectorcoilid: 1, // 检测器线圈id(非关联检测器id)
208
- Motorways: [], // 管理所有自定义机动车图标数据
209
- customlist: [], // 所有自定义的图标列表
210
- Texts: [], // 管理所有自定义文字数据
211
- Pedwalk: [], // 管理所有人行横道
212
- Detector: [], // 管理所有检测器
213
- DetectorChart: [], // 管理所有检测器统计图
214
- motorwayicon: '',
215
- IconLengh: 45,
216
- IconWdith: 100,
217
- textareaW: 200,
218
- textareaH: 100,
219
- pedW: 206,
220
- pedH: 22,
221
- MapW: 800,
222
- MapH: 200,
223
- detectorW: 20,
224
- detectorH: 20,
225
- detectorchartW: 70,
226
- detectorchartH: 100,
227
- isLockedCrossMap: true, // 底图是否是锁定状态
228
- CrossMapData: {
229
- index: -2,
230
- icontype: 'crossmap',
231
- x: 400,
232
- y: 100,
233
- w: 800,
234
- h: 200,
235
- angle: 0,
236
- svgstr: '',
237
- imgfilesrc: ''
238
- }, // 管理底图数据
239
- allitem: {
240
- x: 435,
241
- y: 325,
242
- w: 870,
243
- h: 650,
244
- angle: 0
245
- },
246
- countdownW: 140,
247
- countdownH: 140,
248
- Countdown: [], // 管理倒计时图标
249
- phaseCountdownMock: [
250
- {
251
- id: 2,
252
- phaseCountdown: 59,
253
- phaseCountdownColor: '#fff'
254
- },
255
- {
256
- id: 5,
257
- phaseCountdown: 32,
258
- phaseCountdownColor: '#fff'
259
- }
260
- ], // 倒计时动态数据模拟
261
- svgvisible: false,
262
- pointchange: false, // 控制选中时光标样式
263
- CrossMapVisible: true, // 控制底图显示隐藏
264
-
265
- curChooseIconIndex: -1, // 底图暂用-2代替,别的图标与递增的index相关
266
- curChooseIcon: {},
267
- editBtnGroup: [
268
- {
269
- label: this.$t('openatccomponents.channelizationmap.motorway'),
270
- type: 'motorway',
271
- active: false,
272
- width: '16px',
273
- height: '16px'
274
- },
275
- {
276
- label: this.$t('openatccomponents.channelizationmap.pedcrossing'),
277
- type: 'pedcrossing',
278
- active: false,
279
- width: '16px',
280
- height: '16px'
281
- },
282
- {
283
- label: this.$t('openatccomponents.channelizationmap.countdown'),
284
- type: 'countdown',
285
- active: false,
286
- width: '16px',
287
- height: '16px'
288
- },
289
- {
290
- label: this.$t('openatccomponents.channelizationmap.detector'),
291
- type: 'detector',
292
- active: false,
293
- width: '16px',
294
- height: '16px'
295
- }
296
- ],
297
- AddType: '', // 正在添加的图标类型
298
-
299
- dirNameMap: new Map([
300
- [1, '直行'],
301
- [2, '左转'],
302
- [3, '右转'],
303
- [4, '掉头']
304
- ]),
305
- phaseAssociatedMap: new Map(), // 关联相位Map: key 是相位ID, value 是车道数据包含direction
306
- dialogVisible: false,
307
- LoadedChannelizatonData: {} // 从接口获取到的渠化参数,用于作为加载数据,从文件导入可修改
308
- }
309
- },
310
- methods: {
311
- clickOpen () {
312
- this.$refs.importDialog.clickOpen()
313
- },
314
-
315
- // 改变鼠标样式
316
- changeMouse () {
317
- if (!this.isSeletable) return
318
- document.getElementById('sketchpadArea').style.cursor =
319
- 'url(resource/pic/icons/magnifier3.cur) 12 12,pointer'
320
- this.pointchange = true
321
- },
322
-
323
- // 根据类型,表格编辑后,修改数据策略
324
- changeIconDataByType (iconObj, changefield) {
325
- this.curChooseIcon = JSON.parse(JSON.stringify(iconObj))
326
- // 根据数据类型改变数据
327
- switch (iconObj.icontype) {
328
- case 'text':
329
- this.changeText(iconObj, changefield)
330
- break
331
- case 'vehile':
332
- this.changeMotorwayItem(iconObj, changefield)
333
- break
334
- case 'ped':
335
- this.changePedItem(iconObj, changefield)
336
- break
337
- case 'countdown':
338
- this.changeTimeItem(iconObj, changefield)
339
- break
340
- case 'detector':
341
- this.changeDetectorItem(iconObj, changefield)
342
- break
343
- case 'crossmap':
344
- this.changeCrossMap(iconObj, changefield)
345
- }
346
- console.log('this.customlist', this.customlist)
347
- },
348
-
349
- // 被删除的相位所关联的车道,解除相位关联
350
- handleDisassociatePhase (deletePhaseid) {
351
- for (let i = 0; i < this.Motorways.length; i++) {
352
- if (this.Motorways[i].phaseid === deletePhaseid) {
353
- this.Motorways[i].phaseid = undefined
354
- this.Motorways[i].phaselabel = ''
355
- this.Motorways[i].phasetype = undefined
356
- }
357
- }
358
- for (let i = 0; i < this.Pedwalk.length; i++) {
359
- if (this.Pedwalk[i].phaseid === deletePhaseid) {
360
- this.Pedwalk[i].phaseid = undefined
361
- this.Pedwalk[i].phaselabel = ''
362
- this.Pedwalk[i].phasetype = undefined
363
- }
364
- }
365
- },
366
-
367
- // 添加不同类型的车道图标
368
- handleAddIcon (editbtn) {
369
- // 按钮及图标高亮效果实现
370
- this.editBtnGroup = this.editBtnGroup.map(btn => {
371
- btn.active = false
372
- return btn
373
- })
374
- for (let i = 0; i < this.editBtnGroup.length; i++) {
375
- if (this.editBtnGroup[i].type === editbtn.type) {
376
- this.editBtnGroup[i].active = true
377
- }
378
- }
379
- this.changeMouse()
380
- this.AddType = editbtn.type
381
- },
382
-
383
- addMotorwayIcon () {
384
- this.PhaseDataModel = new PhaseDataModel()
385
- let defaultMotorwayParam = {
386
- x: this.setLeft,
387
- y: this.setTop,
388
- w: this.IconLengh,
389
- h: this.IconWdith,
390
- angle: 0
391
- }
392
- this.IconLengh = 45
393
- this.IconWdith = 100
394
- let Motorwaysitem = {
395
- index: this.index,
396
- id: this.motorid,
397
- icontype: 'vehile',
398
- icondireid: [1], // 前端区分箭头方向的标识
399
- icondirename: [this.PhaseDataModel.getPhase(1).name],
400
- lanePosition: 1,
401
- controltype: 0,
402
- phasetype: undefined,
403
- phaseid: undefined,
404
- phaselabel: '',
405
- direction: [], // 值为1-16,对应16个方向
406
- flip: false, // 车道类型是否翻转显示
407
- ...defaultMotorwayParam
408
- }
409
- this.curChooseIconIndex = Motorwaysitem.index
410
- this.curChooseIcon = JSON.parse(JSON.stringify(Motorwaysitem))
411
- this.Motorways.push(Motorwaysitem)
412
- this.customlist.push(Motorwaysitem)
413
- this.index = this.increaseId(this.customlist, 'index')
414
- this.motorid = this.increaseId(this.Motorways, 'id')
415
- },
416
- changeMotorwayItem (MotorwayItem, fields) {
417
- this.changeItem(MotorwayItem, fields, this.Motorways)
418
- this.changeCustomItem(MotorwayItem, fields)
419
- },
420
-
421
- // 选中图标
422
- handleSelectIcon (iconobj, isCrossMap) {
423
- // console.log('选中的图标', iconobj)
424
- if (isCrossMap === 'crossmap') {
425
- this.curChooseIconIndex = -2
426
- } else {
427
- this.curChooseIconIndex = iconobj.index
428
- }
429
- this.curChooseIcon = JSON.parse(JSON.stringify(iconobj))
430
- },
431
- // 根据多选的车道,修改车道图标
432
- handleChooseDire (iconObj) {
433
- this.curChooseIcon = JSON.parse(JSON.stringify(iconObj))
434
- let editDirections = iconObj.icondireid
435
- if (
436
- this.curChooseIcon.icontype === 'vehile'
437
- ) {
438
- this.curChooseIcon.icondireid = editDirections
439
- this.curChooseIcon.icondirename = editDirections.map(dir =>
440
- this.dirNameMap.get(dir)
441
- )
442
- this.changeMotorwayItem(this.curChooseIcon, [
443
- 'icondireid',
444
- 'icondirename'
445
- ])
446
- }
447
- },
448
-
449
- addPedwalkIcon () {
450
- let defaulPedParam = {
451
- x: this.setLeft,
452
- y: this.setTop,
453
- w: this.pedW,
454
- h: this.pedH,
455
- angle: 0,
456
- viewbox: [0, 0, 206, 22]
457
- }
458
- this.pedW = 206
459
- this.pedH = 22
460
- let peditem = {
461
- index: this.index,
462
- id: this.pedid,
463
- icontype: 'ped',
464
- iconpedtypeid: 1,
465
- iconpedposition: 1,
466
- phasetype: undefined,
467
- phaseid: undefined,
468
- phaselabel: '',
469
- ...defaulPedParam
470
- }
471
- this.curChooseIconIndex = peditem.index
472
- this.curChooseIcon = JSON.parse(JSON.stringify(peditem))
473
- this.Pedwalk.push(peditem)
474
- this.customlist.push(peditem)
475
- this.index = this.increaseId(this.customlist, 'index')
476
- this.pedid = this.increaseId(this.Pedwalk, 'id')
477
- },
478
- changePedItem (PedItem, fields) {
479
- this.changeItem(PedItem, fields, this.Pedwalk)
480
- this.changeCustomItem(PedItem, fields)
481
- },
482
-
483
- handleChoosePed (pediconobj) {
484
- this.curChooseIcon = JSON.parse(JSON.stringify(pediconobj))
485
- if (this.curChooseIcon.icontype === 'ped') {
486
- this.curChooseIcon.iconpedtypeid = pediconobj.iconpedtypeid
487
- this.curChooseIcon.iconpedposition = pediconobj.iconpedposition
488
- this.changePedItem(this.curChooseIcon, ['iconpedtypeid', 'iconpedposition'])
489
- }
490
- console.log(this.curChooseIcon)
491
- },
492
-
493
- addTimer () {
494
- let defaultCountParam = {
495
- x: this.setLeft,
496
- y: this.setTop,
497
- w: this.countdownW,
498
- h: this.countdownH,
499
- angle: 0
500
- }
501
- this.countdownW = 140
502
- this.countdownH = 140
503
- let countdownitem = {
504
- index: this.index,
505
- icontype: 'countdown',
506
- ...defaultCountParam
507
- }
508
- this.curChooseIconIndex = countdownitem.index
509
- this.curChooseIcon = JSON.parse(JSON.stringify(countdownitem))
510
- this.Countdown.push(countdownitem)
511
- this.customlist.push(countdownitem)
512
- this.index = this.increaseId(this.customlist, 'index')
513
- },
514
- changeTimeItem (timeItem, fields) {
515
- this.changeItem(timeItem, fields, this.Countdown)
516
- this.changeCustomItem(timeItem, fields)
517
- },
518
-
519
- addAllDetector () {
520
- // 统计图暂留
521
- this.addDetector()
522
- // this.addDetectorChart()
523
- this.detectorcoilid = this.increaseId(this.Detector, 'id')
524
- },
525
- addDetector () {
526
- let defaultDetectorParam = {
527
- x: this.setLeft,
528
- y: this.setTop,
529
- w: this.detectorW,
530
- h: this.detectorH,
531
- angle: 0
532
- }
533
- this.detectorW = 20
534
- this.detectorH = 20
535
- let detectoritem = {
536
- index: this.index,
537
- id: this.detectorcoilid,
538
- icontype: 'detector',
539
- detailtype: 'detector',
540
- detectortype: 1, // 检测器类型: 1 车辆检测器 2 行人检测器
541
- detectorid: undefined,
542
- occupancythreshold: 80,
543
- minflowsaturationthreshold: 30,
544
- maxflowsaturationthreshold: 70,
545
- ...defaultDetectorParam
546
- }
547
- this.curChooseIconIndex = detectoritem.index
548
- this.curChooseIcon = JSON.parse(JSON.stringify(detectoritem))
549
- this.Detector.push(detectoritem)
550
- this.customlist.push(detectoritem)
551
- this.index = this.increaseId(this.customlist, 'index')
552
- },
553
- changeDetectorItem (detectorItem, fields) {
554
- this.changeItem(detectorItem, fields, this.Detector)
555
- this.changeCustomItem(detectorItem, fields)
556
- },
557
- addDetectorChart () {
558
- let defaultDetectorParam = {
559
- x: this.setLeft,
560
- y: this.setTop - 100, // 偏移到检测器正上方150
561
- w: this.detectorchartW,
562
- h: this.detectorchartH,
563
- angle: 0
564
- }
565
- this.detectorchartW = 70
566
- this.detectorchartH = 100
567
- let detectoritem = {
568
- index: this.index,
569
- id: this.detectorcoilid,
570
- icontype: 'detector',
571
- detailtype: 'detectorChart',
572
- ...defaultDetectorParam
573
- }
574
- this.curChooseIconIndex = detectoritem.index
575
- this.curChooseIcon = JSON.parse(JSON.stringify(detectoritem))
576
- this.DetectorChart.push(detectoritem)
577
- this.customlist.push(detectoritem)
578
- this.index = this.increaseId(this.customlist, 'index')
579
- },
580
- changeDetectorChartItem (detectorItem, fields) {
581
- this.changeItem(detectorItem, fields, this.DetectorChart)
582
- this.changeCustomItem(detectorItem, fields)
583
- },
584
-
585
- // 添加文字
586
- addText () {
587
- let defaultTextParam = {
588
- x: this.textareaW / 2,
589
- y: this.textareaH / 2,
590
- w: this.textareaW,
591
- h: this.textareaH,
592
- angle: 0
593
- }
594
- this.textareaW = 200
595
- this.textareaH = 100
596
- let textitem = {
597
- index: this.index,
598
- icontype: 'text',
599
- text: '',
600
- ...defaultTextParam
601
- }
602
- this.Texts.push(textitem)
603
- this.customlist.push(textitem)
604
- this.index = this.increaseId(this.customlist, 'index')
605
- },
606
- changeText (textobj, fields) {
607
- this.changeItem(textobj, fields, this.Texts)
608
- this.changeCustomItem(textobj, fields)
609
- },
610
-
611
- changeCustomItem (row, fields) {
612
- this.changeItem(row, fields, this.customlist)
613
- },
614
- changeItem (row, fieldarr, data) {
615
- for (let item of data) {
616
- if (item.index === row.index) {
617
- for (let field of fieldarr) {
618
- item[field] = row[field]
619
- }
620
- }
621
- }
622
- },
623
- deleteItem (row) {
624
- let index = row.index
625
- // let id = row.id
626
- this.customlist = this.customlist.filter(ele => ele.index !== index)
627
- switch (row.icontype) {
628
- // case 'text':
629
- // this.Texts = this.Texts.filter(ele => ele.index !== index)
630
- // break
631
- case 'vehile':
632
- this.Motorways = this.Motorways.filter(ele => ele.index !== index)
633
- this.motorid = this.increaseId(this.Motorways, 'id')
634
- break
635
- case 'ped':
636
- this.Pedwalk = this.Pedwalk.filter(ele => ele.index !== index)
637
- this.pedid = this.increaseId(this.Pedwalk, 'id')
638
- break
639
- case 'countdown':
640
- this.Countdown = this.Countdown.filter(ele => ele.index !== index)
641
- break
642
- case 'detector':
643
- this.Detector = this.Detector.filter(ele => ele.index !== index)
644
- // this.DetectorChart = this.DetectorChart.filter(ele => ele.id !== id)
645
- this.detectorcoilid = this.increaseId(this.Detector, 'id')
646
- }
647
- this.curChooseIconIndex = -1
648
- this.curChooseIcon = {}
649
- },
650
- cloneItem (row) {
651
- // 克隆元素
652
- let cloneObj = {
653
- ...row,
654
- index: this.index,
655
- x: 435,
656
- y: 325
657
- }
658
- switch (row.icontype) {
659
- case 'vehile':
660
- cloneObj.id = this.motorid
661
- this.Motorways.push(cloneObj)
662
- this.motorid = this.increaseId(this.Motorways, 'id')
663
- this.customlist.push(cloneObj)
664
- break
665
- case 'ped':
666
- cloneObj.id = this.pedid
667
- this.Pedwalk.push(cloneObj)
668
- this.pedid = this.increaseId(this.Pedwalk, 'id')
669
- this.customlist.push(cloneObj)
670
- break
671
- // case 'countdown':
672
- // this.Countdown.push(cloneObj)
673
- // this.customlist.push(cloneObj)
674
- // break
675
- case 'detector':
676
- cloneObj.id = this.detectorcoilid
677
- this.Detector.push(cloneObj)
678
- this.customlist.push(cloneObj)
679
- // 同时克隆统计图
680
- // this.index = this.increaseId(this.customlist, 'index')
681
- // let curchartobj = JSON.parse(JSON.stringify(this.DetectorChart)).filter(ele => ele.id === row.id)[0]
682
- // curchartobj.index = this.index
683
- // curchartobj.id = this.detectorcoilid
684
- // curchartobj.x = 435
685
- // curchartobj.y = 325 - 100
686
- // this.DetectorChart.push(curchartobj)
687
- // this.customlist.push(curchartobj)
688
- this.detectorcoilid = this.increaseId(this.Detector, 'id')
689
- }
690
- this.curChooseIconIndex = this.index
691
- this.curChooseIcon = JSON.parse(JSON.stringify(cloneObj))
692
- this.index = this.increaseId(this.customlist, 'index')
693
- },
694
-
695
- loadSvgString (type, imgstr) {
696
- // 加载用户上传的底图svg字符串
697
- if (type === 'vectorgraph') {
698
- // 导入矢量图
699
- // this.getCrossMapViewbox(imgstr)
700
- this.CrossMapData = {
701
- ...this.CrossMapData,
702
- type,
703
- svgstr: imgstr
704
- }
705
- }
706
- if (type === 'picture') {
707
- // 导入图片
708
- this.CrossMapData = {
709
- ...this.CrossMapData,
710
- type,
711
- imgfilesrc: imgstr
712
- }
713
- }
714
- },
715
- loadMapSize (type, mapsize) {
716
- this.CrossMapData = {
717
- ...this.CrossMapData,
718
- angle: 0,
719
- x: Math.round(mapsize.width / 2),
720
- y: Math.round(mapsize.height / 2),
721
- w: Math.round(mapsize.width),
722
- h: Math.round(mapsize.height)
723
- }
724
- this.MapW = mapsize.width
725
- this.MapH = mapsize.height
726
- },
727
-
728
- getCrossMapViewbox (svgstr) {
729
- // 获取户上传svg的viewBox属性的大小
730
- let arr = svgstr.split('"')
731
- let index, viewBox
732
- for (let i = 0; i < arr.length - 1; i++) {
733
- if (arr[i].indexOf('viewBox') !== -1) {
734
- index = i
735
- }
736
- }
737
- if (index) {
738
- viewBox = arr[index + 1]
739
- }
740
- this.MapW = Number(viewBox.split(' ')[2])
741
- this.MapH = Number(viewBox.split(' ')[3])
742
- },
743
- changeCrossMap (mapdata, fields) {
744
- this.changeItem(mapdata, fields, [this.CrossMapData])
745
- },
746
-
747
- // 重置
748
- handleReset () {
749
- this.customlist = []
750
- this.Texts = []
751
- this.Motorways = []
752
- this.Countdown = []
753
- this.Pedwalk = []
754
- this.Detector = []
755
- this.DetectorChart = []
756
- this.CrossMapData = {
757
- index: -2, // 暂定为-2,用于复用图标判断逻辑
758
- icontype: 'crossmap',
759
- x: this.MapW / 2,
760
- y: this.MapH / 2,
761
- w: this.MapW,
762
- h: this.MapH,
763
- angle: 0,
764
- svgstr: '',
765
- imgfilesrc: ''
766
- }
767
- this.index = 0
768
- this.curChooseIcon = {}
769
- },
770
- // 取消
771
- cancledraw () {
772
- this.canclesettingvisible = true
773
- },
774
- completeSetting () {
775
- this.canclesettingvisible = false
776
- this.$router.push('/overview/index')
777
- },
778
- cancleSetting () {
779
- this.canclesettingvisible = false
780
- },
781
- handleSaveParams () {
782
- let temp = {}
783
- console.log(this.customlist)
784
- for (const item of this.customlist) {
785
- if (temp.hasOwnProperty(item.icontype)) {
786
- temp[item.icontype].push(item)
787
- } else {
788
- temp[item.icontype] = [item]
789
- }
790
- }
791
- if (this.CrossMapData.svgstr !== '' || this.CrossMapData.imgfilesrc !== '') {
792
- temp.crossMap = this.CrossMapData
793
- }
794
- return temp
795
- },
796
- // 保存
797
- savedraw () {
798
- let temp = {}
799
- temp = this.handleSaveParams()
800
- this.saveChannelizatonChart(temp)
801
- },
802
- // 加载
803
- load (type) {
804
- this.curChooseIconIndex = -1
805
- let savedTemp = JSON.parse(JSON.stringify(this.LoadedChannelizatonData))
806
- let arr = []
807
- for (const [key, value] of Object.entries(savedTemp)) {
808
- if (key === 'vehile') {
809
- this.Motorways = value
810
- }
811
- if (key === 'text') {
812
- this.Texts = value
813
- }
814
- if (key === 'ped') {
815
- this.Pedwalk = value
816
- }
817
- if (key === 'countdown') {
818
- this.Countdown = value
819
- }
820
- if (key === 'detector') {
821
- this.Detector = value.filter(ele => ele.detailtype === 'detector')
822
- // this.DetectorChart = value.filter(ele => ele.detailtype === 'detectorChart')
823
- }
824
- if (key === 'crossMap') {
825
- this.CrossMapData = JSON.parse(JSON.stringify(value))
826
- if (value.icontype === undefined) {
827
- this.CrossMapData.icontype = 'crossmap'
828
- }
829
- } else {
830
- if (value.length > 1) {
831
- arr = [...arr, ...value]
832
- } else {
833
- arr.push(value[0])
834
- }
835
- }
836
- }
837
- this.customlist = JSON.parse(JSON.stringify(arr))
838
- if (this.customlist.length > 0) {
839
- this.index = this.increaseId(this.customlist, 'index')
840
- }
841
- if (this.Motorways.length > 0) {
842
- this.motorid = this.increaseId(this.Motorways, 'id')
843
- }
844
- if (this.Pedwalk.length > 0) {
845
- this.pedid = this.increaseId(this.Pedwalk, 'id')
846
- }
847
- if (this.Detector.length > 0) {
848
- this.detectorcoilid = this.increaseId(this.Detector, 'id')
849
- }
850
- },
851
- increaseId (arr, field) { // 实现field对应的index或者id, 在arr的基础上寻找最小的
852
- let List = arr.map(ele => ele[field])
853
- let i = List.length - 1
854
- if (i >= 0) {
855
- for (let j = 1; j <= 200; j++) {
856
- if (!List.includes(j)) {
857
- return j
858
- }
859
- }
860
- }
861
- },
862
-
863
- exitEdit () {
864
- this.isSeletable = !this.isSeletable
865
- },
866
-
867
- resetAddParams () {
868
- this.AddType = ''
869
- this.editBtnGroup = this.editBtnGroup.map(btn => {
870
- btn.active = false
871
- return btn
872
- })
873
- },
874
- saveChannelizatonChart (ChannelizatonData) {
875
- // let agentid = getIframdevid()
876
- let params = {
877
- agentid: this.AgentId,
878
- data: ChannelizatonData
879
- }
880
- if (ChannelizatonData.crossMap && ChannelizatonData.crossMap.type === 'vectorgraph') {
881
- ChannelizatonData.crossMap.imgfilesrc = ''
882
- }
883
- if (ChannelizatonData.crossMap && ChannelizatonData.crossMap.type === 'picture') {
884
- ChannelizatonData.crossMap.svgstr = ''
885
- }
886
- saveChannelizatonChart(params).then(data => {
887
- this.$emit('saveCallback', data)
888
- if (!data.data.success) {
889
- let parrenterror = getMessageByCode(data.data.code, this.$i18n.locale)
890
- if (data.data.data) {
891
- // 子类型错误
892
- let childErrorCode = data.data.data.errorCode
893
- if (childErrorCode) {
894
- let childerror = getMessageByCode(data.data.data.errorCode, this.$i18n.locale)
895
- this.$message.error(parrenterror + ',' + childerror)
896
- }
897
- } else {
898
- this.$message.error(parrenterror)
899
- }
900
- return
901
- }
902
- let msg = this.$t('openatccomponents.common.savesucess')
903
- this.$message({
904
- message: msg,
905
- type: 'success',
906
- duration: 1 * 1000
907
- })
908
- })
909
- },
910
- handleClickSketchpad () {
911
- // 监听画板区域点击事件,改变图标放置的位置
912
- let sketchpadArea = document.getElementById('sketchpadArea')
913
- let _this = this
914
- sketchpadArea.addEventListener('click', function (e) {
915
- if (_this.pointchange) {
916
- document.getElementById('sketchpadArea').style.cursor =
917
- 'url(resource/pic/icons/magnifier3.cur) 12 12,default'
918
- _this.pointchange = false
919
- let boundingClientLeft = document.getElementById('channelizationElements').getBoundingClientRect().left
920
- let boundingClientTop = document.getElementById('channelizationElements').getBoundingClientRect().top
921
- _this.setLeft = Math.round(e.clientX - boundingClientLeft) // 四舍五入
922
- _this.setTop = Math.round(e.clientY - boundingClientTop)
923
- if (_this.AddType === '') return
924
- switch (_this.AddType) {
925
- case 'motorway':
926
- _this.addMotorwayIcon()
927
- break
928
- case 'pedcrossing':
929
- _this.addPedwalkIcon()
930
- break
931
- case 'countdown':
932
- _this.addTimer()
933
- break
934
- case 'detector':
935
- _this.addAllDetector()
936
- }
937
- _this.resetAddParams()
938
- }
939
- })
940
- },
941
- handleLockCrossMap () {
942
- this.isLockedCrossMap = !this.isLockedCrossMap
943
- },
944
- importFromFile () {
945
- this.dialogVisible = true
946
- },
947
- readAsText () {
948
- let _this = this
949
- var file = document.getElementById('file').files[0]
950
- var reader = new FileReader()
951
- reader.async = true
952
- // 将文件以文本形式读入页面
953
- reader.readAsText(file)
954
- reader.onload = function (f) {
955
- setTimeout(() => {
956
- _this.LoadedChannelizatonData = {}
957
- _this.handleReset()
958
- _this.dialogVisible = false
959
- _this.LoadedChannelizatonData = JSON.parse(this.result)
960
- _this.load()
961
- _this.$alert(_this.$t('openatccomponents.channelizationmap.importfilesuccess'), { type: 'success' })
962
- }, 50)
963
- }
964
- },
965
- async exportToFile () {
966
- let tscParam = this.handleSaveParams()
967
- let content = new Blob([JSON.stringify(tscParam)])
968
- // 生成url对象
969
- let urlObject = window.URL || window.webkitURL || window
970
- let url = urlObject.createObjectURL(content)
971
- // 生成<a></a>DOM元素
972
- let el = document.createElement('a')
973
- // 链接赋值
974
- el.href = url
975
- el.download = 'ChanelizationParam.json'
976
- // 必须点击否则不会下载
977
- el.click()
978
- // 移除链接释放资源
979
- urlObject.revokeObjectURL(url)
980
- }
981
- },
982
- mounted () {
983
- this.handleClickSketchpad()
984
- }
985
- }
986
- </script>
987
-
988
- <style lang="css" rel="stylesheet/scss">
989
- </style>
1
+ /**
2
+ * Copyright (c) 2020 kedacom
3
+ * OpenATC is licensed under Mulan PSL v2.
4
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
5
+ * You may obtain a copy of Mulan PSL v2 at:
6
+ * http://license.coscl.org.cn/MulanPSL2
7
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
+ * See the Mulan PSL v2 for more details.
11
+ **/
12
+ <!--渠化绘制功能-->
13
+ <template>
14
+ <div class="custom-cross" v-if="visible">
15
+ <ImportDialog ref="importDialog" @loadSvgString="loadSvgString" @loadMapSize="loadMapSize" />
16
+ <Messagebox :visible="canclesettingvisible" :text="$t('openatccomponents.channelizationmap.canclesetting')" @cancle="cancleSetting" @ok="completeSetting"/>
17
+ <div class="custom-main" ref="custommain">
18
+ <div class="custom-group drawPanelAnimation" ref="customGroup">
19
+ <!-- 绘制功能 -->
20
+ <div class="draw-function">
21
+ <div class="again-import">
22
+ <span class="import-label">{{$t('openatccomponents.channelizationmap.importcrosspicture')}}</span>
23
+ <el-button
24
+ class="again-import-btn"
25
+ type="primary"
26
+ :disabled="!isSeletable"
27
+ @click="clickOpen"
28
+ >{{$t('openatccomponents.channelizationmap.againimport')}}</el-button>
29
+ <i class="lock-map el-icon-unlock" v-if="isLockedCrossMap" @click="handleLockCrossMap()"></i>
30
+ <i class="lock-map el-icon-lock" v-if="!isLockedCrossMap" @click="handleLockCrossMap()"></i>
31
+ </div>
32
+
33
+ <div class="draw-to-sketchpad">
34
+ <div class="drawtip">{{$t('openatccomponents.channelizationmap.drawtips')}}</div>
35
+ <div class="draw-operation">
36
+ <!-- <el-button
37
+ type="primary"
38
+ :disabled="!isSeletable"
39
+ @click="addText"
40
+ >添加text</el-button>-->
41
+ <el-button
42
+ v-for="editbtn in editBtnGroup"
43
+ :key="editbtn.type"
44
+ class="edit-icon-btn"
45
+ @click="handleAddIcon(editbtn)"
46
+ >
47
+ <LaneIconSvg :laneicon="editbtn"/>
48
+ <div
49
+ class="btn-label"
50
+ :class="{'highlightColor': editbtn.active === true, 'defaultColor': editbtn.active === false}"
51
+ >{{editbtn.label}}</div>
52
+ </el-button>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ <!-- 画板区域 -->
57
+ <div class="sketchpad-area" id="sketchpadgroup" ref="sketchpadgroup">
58
+ <ChannelizationElements
59
+ id="channelizationElements"
60
+ :allitem="allitem"
61
+ :CrossMapVisible="CrossMapVisible"
62
+ :CrossMapData="CrossMapData"
63
+ :isSeletable="isSeletable"
64
+ :pointchange="pointchange"
65
+ @changeCrossMap="changeCrossMap"
66
+ :Motorways="Motorways"
67
+ :curChooseIconIndex="curChooseIconIndex"
68
+ @changeMotorwayItem="changeMotorwayItem"
69
+ @handleSelectIcon="handleSelectIcon"
70
+ :Countdown="Countdown"
71
+ :CountdownList="phaseCountdownMock"
72
+ @changeTimeItem="changeTimeItem"
73
+ :Pedwalk="Pedwalk"
74
+ @changePedItem="changePedItem"
75
+ :Detector="Detector"
76
+ @changeDetectorItem="changeDetectorItem"
77
+ :DetectorChart="DetectorChart"
78
+ :CurChooseIcon="curChooseIcon"
79
+ @changeDetectorChartItem="changeDetectorChartItem"
80
+ :isLockedCrossMap="isLockedCrossMap"
81
+ />
82
+ </div>
83
+ <div class="draw-end-function">
84
+ <el-button type="primary" @click="handleReset()">{{$t('openatccomponents.button.reset')}}</el-button>
85
+ <!-- <el-button type="primary" @click="cancledraw()">{{$t('openatccomponents.button.Cancel')}}</el-button> -->
86
+ <el-button type="primary" @click="savedraw()">{{$t('openatccomponents.button.save')}}</el-button>
87
+ <el-button type="primary" @click="importFromFile()">{{$t('openatccomponents.main.import')}}</el-button>
88
+ <el-button type="primary" @click="exportToFile()">{{$t('openatccomponents.main.export')}}</el-button>
89
+ </div>
90
+ </div>
91
+ <div class="custom-edit" ref="customEdit">
92
+ <LaneEditPanel
93
+ :Data="curChooseIcon"
94
+ :choosedirections="curChooseIcon.direction"
95
+ :Motorways="Motorways"
96
+ @handleChooseDire="handleChooseDire"
97
+ @handleChoosePed="handleChoosePed"
98
+ @deleteItem="deleteItem"
99
+ @cloneItem="cloneItem"
100
+ @changeIconDataByType="changeIconDataByType"
101
+ @handleDisassociatePhase="handleDisassociatePhase"
102
+ />
103
+ </div>
104
+ </div>
105
+ <!-- <el-row>
106
+ <div class="phase-table">
107
+ <PhaseTable
108
+ :customlist="customlist"
109
+ @changeText="changeText"
110
+ @deleteItem="deleteItem"
111
+ @changeMotorwayItem="changeMotorwayItem"
112
+ @changeIconDataByType="changeIconDataByType"
113
+ />
114
+ </div>
115
+ </el-row> -->
116
+ <!-- 从文件导入弹窗 -->
117
+ <el-dialog
118
+ :title="$t('openatccomponents.main.tip')"
119
+ :visible.sync="dialogVisible"
120
+ width="30%"
121
+ >
122
+ <input
123
+ type="file"
124
+ id="file"
125
+ />
126
+ <span
127
+ slot="footer"
128
+ class="dialog-footer"
129
+ >
130
+ <el-button @click="dialogVisible = false">{{$t('openatccomponents.common.cancel')}}</el-button>
131
+ <el-button
132
+ type="primary"
133
+ @click="readAsText"
134
+ >{{$t('openatccomponents.common.confirm')}}</el-button>
135
+ </span>
136
+ </el-dialog>
137
+ </div>
138
+ </template>
139
+
140
+ <script>
141
+ import ChannelizationElements from './channelizationElements'
142
+
143
+ import LaneEditPanel from './laneEditPanel'
144
+
145
+ import PhaseTable from './table'
146
+ import PhaseDataModel from './utils/phaseDataModel.js'
147
+ import LaneIconSvg from './iconSvg/laneIcon'
148
+
149
+ import ImportDialog from './importDialog'
150
+ import Messagebox from '../../MessageBox/index'
151
+
152
+ import { mapState } from 'vuex'
153
+
154
+ import { saveChannelizatonChart } from '../../../../api/cross'
155
+ import { getMessageByCode } from '../../../../utils/responseMessage.js'
156
+
157
+ export default {
158
+ name: 'draw-channelization',
159
+ components: {
160
+ Messagebox,
161
+ ImportDialog,
162
+ ChannelizationElements,
163
+ PhaseTable,
164
+ LaneIconSvg,
165
+ LaneEditPanel
166
+ },
167
+ computed: {
168
+ ...mapState({
169
+ phaseList: state => state.globalParam.tscParam.phaseList
170
+ })
171
+ },
172
+ props: {
173
+ loadedChannelizatonData: {
174
+ type: Object
175
+ },
176
+ AgentId: {
177
+ type: String,
178
+ default: '0'
179
+ }
180
+ },
181
+ watch: {
182
+ AgentId: {
183
+ handler: function (val) {
184
+ // 平台设备切换时,清空上一个渠化配置
185
+ this.handleReset()
186
+ },
187
+ deep: true
188
+ },
189
+ loadedChannelizatonData: {
190
+ handler: function (val) {
191
+ // 平台设备切换时,重载当前路口保存的渠化配置
192
+ this.LoadedChannelizatonData = JSON.parse(JSON.stringify(val))
193
+ this.load('all')
194
+ },
195
+ deep: true
196
+ }
197
+ },
198
+ data () {
199
+ return {
200
+ visible: true,
201
+ canclesettingvisible: false,
202
+
203
+ isSeletable: true, // 元素是否可以编辑
204
+ index: 0,
205
+ motorid: 1, // 车道id
206
+ pedid: 1, // 人行道id
207
+ detectorcoilid: 1, // 检测器线圈id(非关联检测器id)
208
+ Motorways: [], // 管理所有自定义机动车图标数据
209
+ customlist: [], // 所有自定义的图标列表
210
+ Texts: [], // 管理所有自定义文字数据
211
+ Pedwalk: [], // 管理所有人行横道
212
+ Detector: [], // 管理所有检测器
213
+ DetectorChart: [], // 管理所有检测器统计图
214
+ motorwayicon: '',
215
+ IconLengh: 45,
216
+ IconWdith: 100,
217
+ textareaW: 200,
218
+ textareaH: 100,
219
+ pedW: 206,
220
+ pedH: 22,
221
+ MapW: 800,
222
+ MapH: 200,
223
+ detectorW: 20,
224
+ detectorH: 20,
225
+ detectorchartW: 70,
226
+ detectorchartH: 100,
227
+ isLockedCrossMap: true, // 底图是否是锁定状态
228
+ CrossMapData: {
229
+ index: -2,
230
+ icontype: 'crossmap',
231
+ x: 400,
232
+ y: 100,
233
+ w: 800,
234
+ h: 200,
235
+ angle: 0,
236
+ svgstr: '',
237
+ imgfilesrc: ''
238
+ }, // 管理底图数据
239
+ allitem: {
240
+ x: 435,
241
+ y: 325,
242
+ w: 870,
243
+ h: 650,
244
+ angle: 0
245
+ },
246
+ countdownW: 140,
247
+ countdownH: 140,
248
+ Countdown: [], // 管理倒计时图标
249
+ phaseCountdownMock: [
250
+ {
251
+ id: 2,
252
+ phaseCountdown: 59,
253
+ phaseCountdownColor: '#fff'
254
+ },
255
+ {
256
+ id: 5,
257
+ phaseCountdown: 32,
258
+ phaseCountdownColor: '#fff'
259
+ }
260
+ ], // 倒计时动态数据模拟
261
+ svgvisible: false,
262
+ pointchange: false, // 控制选中时光标样式
263
+ CrossMapVisible: true, // 控制底图显示隐藏
264
+
265
+ curChooseIconIndex: -1, // 底图暂用-2代替,别的图标与递增的index相关
266
+ curChooseIcon: {},
267
+ editBtnGroup: [
268
+ {
269
+ label: this.$t('openatccomponents.channelizationmap.motorway'),
270
+ type: 'motorway',
271
+ active: false,
272
+ width: '16px',
273
+ height: '16px'
274
+ },
275
+ {
276
+ label: this.$t('openatccomponents.channelizationmap.pedcrossing'),
277
+ type: 'pedcrossing',
278
+ active: false,
279
+ width: '16px',
280
+ height: '16px'
281
+ },
282
+ {
283
+ label: this.$t('openatccomponents.channelizationmap.countdown'),
284
+ type: 'countdown',
285
+ active: false,
286
+ width: '16px',
287
+ height: '16px'
288
+ },
289
+ {
290
+ label: this.$t('openatccomponents.channelizationmap.detector'),
291
+ type: 'detector',
292
+ active: false,
293
+ width: '16px',
294
+ height: '16px'
295
+ }
296
+ ],
297
+ AddType: '', // 正在添加的图标类型
298
+
299
+ dirNameMap: new Map([
300
+ [1, '直行'],
301
+ [2, '左转'],
302
+ [3, '右转'],
303
+ [4, '掉头']
304
+ ]),
305
+ phaseAssociatedMap: new Map(), // 关联相位Map: key 是相位ID, value 是车道数据包含direction
306
+ dialogVisible: false,
307
+ LoadedChannelizatonData: {} // 从接口获取到的渠化参数,用于作为加载数据,从文件导入可修改
308
+ }
309
+ },
310
+ methods: {
311
+ clickOpen () {
312
+ this.$refs.importDialog.clickOpen()
313
+ },
314
+
315
+ // 改变鼠标样式
316
+ changeMouse () {
317
+ if (!this.isSeletable) return
318
+ document.getElementById('sketchpadArea').style.cursor =
319
+ 'url(resource/pic/icons/magnifier3.cur) 12 12,pointer'
320
+ this.pointchange = true
321
+ },
322
+
323
+ // 根据类型,表格编辑后,修改数据策略
324
+ changeIconDataByType (iconObj, changefield) {
325
+ this.curChooseIcon = JSON.parse(JSON.stringify(iconObj))
326
+ // 根据数据类型改变数据
327
+ switch (iconObj.icontype) {
328
+ case 'text':
329
+ this.changeText(iconObj, changefield)
330
+ break
331
+ case 'vehile':
332
+ this.changeMotorwayItem(iconObj, changefield)
333
+ break
334
+ case 'ped':
335
+ this.changePedItem(iconObj, changefield)
336
+ break
337
+ case 'countdown':
338
+ this.changeTimeItem(iconObj, changefield)
339
+ break
340
+ case 'detector':
341
+ this.changeDetectorItem(iconObj, changefield)
342
+ break
343
+ case 'crossmap':
344
+ this.changeCrossMap(iconObj, changefield)
345
+ }
346
+ console.log('this.customlist', this.customlist)
347
+ },
348
+
349
+ // 被删除的相位所关联的车道,解除相位关联
350
+ handleDisassociatePhase (deletePhaseid) {
351
+ for (let i = 0; i < this.Motorways.length; i++) {
352
+ if (this.Motorways[i].phaseid === deletePhaseid) {
353
+ this.Motorways[i].phaseid = undefined
354
+ this.Motorways[i].phaselabel = ''
355
+ this.Motorways[i].phasetype = undefined
356
+ }
357
+ }
358
+ for (let i = 0; i < this.Pedwalk.length; i++) {
359
+ if (this.Pedwalk[i].phaseid === deletePhaseid) {
360
+ this.Pedwalk[i].phaseid = undefined
361
+ this.Pedwalk[i].phaselabel = ''
362
+ this.Pedwalk[i].phasetype = undefined
363
+ }
364
+ }
365
+ },
366
+
367
+ // 添加不同类型的车道图标
368
+ handleAddIcon (editbtn) {
369
+ // 按钮及图标高亮效果实现
370
+ this.editBtnGroup = this.editBtnGroup.map(btn => {
371
+ btn.active = false
372
+ return btn
373
+ })
374
+ for (let i = 0; i < this.editBtnGroup.length; i++) {
375
+ if (this.editBtnGroup[i].type === editbtn.type) {
376
+ this.editBtnGroup[i].active = true
377
+ }
378
+ }
379
+ this.changeMouse()
380
+ this.AddType = editbtn.type
381
+ },
382
+
383
+ addMotorwayIcon () {
384
+ this.PhaseDataModel = new PhaseDataModel()
385
+ let defaultMotorwayParam = {
386
+ x: this.setLeft,
387
+ y: this.setTop,
388
+ w: this.IconLengh,
389
+ h: this.IconWdith,
390
+ angle: 0
391
+ }
392
+ this.IconLengh = 45
393
+ this.IconWdith = 100
394
+ let Motorwaysitem = {
395
+ index: this.index,
396
+ id: this.motorid,
397
+ icontype: 'vehile',
398
+ icondireid: [1], // 前端区分箭头方向的标识
399
+ icondirename: [this.PhaseDataModel.getPhase(1).name],
400
+ lanePosition: 1,
401
+ controltype: 0,
402
+ phasetype: undefined,
403
+ phaseid: undefined,
404
+ phaselabel: '',
405
+ direction: [], // 值为1-16,对应16个方向
406
+ flip: false, // 车道类型是否翻转显示
407
+ ...defaultMotorwayParam
408
+ }
409
+ this.curChooseIconIndex = Motorwaysitem.index
410
+ this.curChooseIcon = JSON.parse(JSON.stringify(Motorwaysitem))
411
+ this.Motorways.push(Motorwaysitem)
412
+ this.customlist.push(Motorwaysitem)
413
+ this.index = this.increaseId(this.customlist, 'index')
414
+ this.motorid = this.increaseId(this.Motorways, 'id')
415
+ },
416
+ changeMotorwayItem (MotorwayItem, fields) {
417
+ this.changeItem(MotorwayItem, fields, this.Motorways)
418
+ this.changeCustomItem(MotorwayItem, fields)
419
+ },
420
+
421
+ // 选中图标
422
+ handleSelectIcon (iconobj, isCrossMap) {
423
+ // console.log('选中的图标', iconobj)
424
+ if (isCrossMap === 'crossmap') {
425
+ this.curChooseIconIndex = -2
426
+ } else {
427
+ this.curChooseIconIndex = iconobj.index
428
+ }
429
+ this.curChooseIcon = JSON.parse(JSON.stringify(iconobj))
430
+ },
431
+ // 根据多选的车道,修改车道图标
432
+ handleChooseDire (iconObj) {
433
+ this.curChooseIcon = JSON.parse(JSON.stringify(iconObj))
434
+ let editDirections = iconObj.icondireid
435
+ if (
436
+ this.curChooseIcon.icontype === 'vehile'
437
+ ) {
438
+ this.curChooseIcon.icondireid = editDirections
439
+ this.curChooseIcon.icondirename = editDirections.map(dir =>
440
+ this.dirNameMap.get(dir)
441
+ )
442
+ this.changeMotorwayItem(this.curChooseIcon, [
443
+ 'icondireid',
444
+ 'icondirename'
445
+ ])
446
+ }
447
+ },
448
+
449
+ addPedwalkIcon () {
450
+ let defaulPedParam = {
451
+ x: this.setLeft,
452
+ y: this.setTop,
453
+ w: this.pedW,
454
+ h: this.pedH,
455
+ angle: 0,
456
+ viewbox: [0, 0, 206, 22]
457
+ }
458
+ this.pedW = 206
459
+ this.pedH = 22
460
+ let peditem = {
461
+ index: this.index,
462
+ id: this.pedid,
463
+ icontype: 'ped',
464
+ iconpedtypeid: 1,
465
+ iconpedposition: 1,
466
+ phasetype: undefined,
467
+ phaseid: undefined,
468
+ phaselabel: '',
469
+ ...defaulPedParam
470
+ }
471
+ this.curChooseIconIndex = peditem.index
472
+ this.curChooseIcon = JSON.parse(JSON.stringify(peditem))
473
+ this.Pedwalk.push(peditem)
474
+ this.customlist.push(peditem)
475
+ this.index = this.increaseId(this.customlist, 'index')
476
+ this.pedid = this.increaseId(this.Pedwalk, 'id')
477
+ },
478
+ changePedItem (PedItem, fields) {
479
+ this.changeItem(PedItem, fields, this.Pedwalk)
480
+ this.changeCustomItem(PedItem, fields)
481
+ },
482
+
483
+ handleChoosePed (pediconobj) {
484
+ this.curChooseIcon = JSON.parse(JSON.stringify(pediconobj))
485
+ if (this.curChooseIcon.icontype === 'ped') {
486
+ this.curChooseIcon.iconpedtypeid = pediconobj.iconpedtypeid
487
+ this.curChooseIcon.iconpedposition = pediconobj.iconpedposition
488
+ this.changePedItem(this.curChooseIcon, ['iconpedtypeid', 'iconpedposition'])
489
+ }
490
+ console.log(this.curChooseIcon)
491
+ },
492
+
493
+ addTimer () {
494
+ let defaultCountParam = {
495
+ x: this.setLeft,
496
+ y: this.setTop,
497
+ w: this.countdownW,
498
+ h: this.countdownH,
499
+ angle: 0
500
+ }
501
+ this.countdownW = 140
502
+ this.countdownH = 140
503
+ let countdownitem = {
504
+ index: this.index,
505
+ icontype: 'countdown',
506
+ ...defaultCountParam
507
+ }
508
+ this.curChooseIconIndex = countdownitem.index
509
+ this.curChooseIcon = JSON.parse(JSON.stringify(countdownitem))
510
+ this.Countdown.push(countdownitem)
511
+ this.customlist.push(countdownitem)
512
+ this.index = this.increaseId(this.customlist, 'index')
513
+ },
514
+ changeTimeItem (timeItem, fields) {
515
+ this.changeItem(timeItem, fields, this.Countdown)
516
+ this.changeCustomItem(timeItem, fields)
517
+ },
518
+
519
+ addAllDetector () {
520
+ // 统计图暂留
521
+ this.addDetector()
522
+ // this.addDetectorChart()
523
+ this.detectorcoilid = this.increaseId(this.Detector, 'id')
524
+ },
525
+ addDetector () {
526
+ let defaultDetectorParam = {
527
+ x: this.setLeft,
528
+ y: this.setTop,
529
+ w: this.detectorW,
530
+ h: this.detectorH,
531
+ angle: 0
532
+ }
533
+ this.detectorW = 20
534
+ this.detectorH = 20
535
+ let detectoritem = {
536
+ index: this.index,
537
+ id: this.detectorcoilid,
538
+ icontype: 'detector',
539
+ detailtype: 'detector',
540
+ detectortype: 1, // 检测器类型: 1 车辆检测器 2 行人检测器
541
+ detectorid: undefined,
542
+ occupancythreshold: 80,
543
+ minflowsaturationthreshold: 30,
544
+ maxflowsaturationthreshold: 70,
545
+ ...defaultDetectorParam
546
+ }
547
+ this.curChooseIconIndex = detectoritem.index
548
+ this.curChooseIcon = JSON.parse(JSON.stringify(detectoritem))
549
+ this.Detector.push(detectoritem)
550
+ this.customlist.push(detectoritem)
551
+ this.index = this.increaseId(this.customlist, 'index')
552
+ },
553
+ changeDetectorItem (detectorItem, fields) {
554
+ this.changeItem(detectorItem, fields, this.Detector)
555
+ this.changeCustomItem(detectorItem, fields)
556
+ },
557
+ addDetectorChart () {
558
+ let defaultDetectorParam = {
559
+ x: this.setLeft,
560
+ y: this.setTop - 100, // 偏移到检测器正上方150
561
+ w: this.detectorchartW,
562
+ h: this.detectorchartH,
563
+ angle: 0
564
+ }
565
+ this.detectorchartW = 70
566
+ this.detectorchartH = 100
567
+ let detectoritem = {
568
+ index: this.index,
569
+ id: this.detectorcoilid,
570
+ icontype: 'detector',
571
+ detailtype: 'detectorChart',
572
+ ...defaultDetectorParam
573
+ }
574
+ this.curChooseIconIndex = detectoritem.index
575
+ this.curChooseIcon = JSON.parse(JSON.stringify(detectoritem))
576
+ this.DetectorChart.push(detectoritem)
577
+ this.customlist.push(detectoritem)
578
+ this.index = this.increaseId(this.customlist, 'index')
579
+ },
580
+ changeDetectorChartItem (detectorItem, fields) {
581
+ this.changeItem(detectorItem, fields, this.DetectorChart)
582
+ this.changeCustomItem(detectorItem, fields)
583
+ },
584
+
585
+ // 添加文字
586
+ addText () {
587
+ let defaultTextParam = {
588
+ x: this.textareaW / 2,
589
+ y: this.textareaH / 2,
590
+ w: this.textareaW,
591
+ h: this.textareaH,
592
+ angle: 0
593
+ }
594
+ this.textareaW = 200
595
+ this.textareaH = 100
596
+ let textitem = {
597
+ index: this.index,
598
+ icontype: 'text',
599
+ text: '',
600
+ ...defaultTextParam
601
+ }
602
+ this.Texts.push(textitem)
603
+ this.customlist.push(textitem)
604
+ this.index = this.increaseId(this.customlist, 'index')
605
+ },
606
+ changeText (textobj, fields) {
607
+ this.changeItem(textobj, fields, this.Texts)
608
+ this.changeCustomItem(textobj, fields)
609
+ },
610
+
611
+ changeCustomItem (row, fields) {
612
+ this.changeItem(row, fields, this.customlist)
613
+ },
614
+ changeItem (row, fieldarr, data) {
615
+ for (let item of data) {
616
+ if (item.index === row.index) {
617
+ for (let field of fieldarr) {
618
+ item[field] = row[field]
619
+ }
620
+ }
621
+ }
622
+ },
623
+ deleteItem (row) {
624
+ let index = row.index
625
+ // let id = row.id
626
+ this.customlist = this.customlist.filter(ele => ele.index !== index)
627
+ switch (row.icontype) {
628
+ // case 'text':
629
+ // this.Texts = this.Texts.filter(ele => ele.index !== index)
630
+ // break
631
+ case 'vehile':
632
+ this.Motorways = this.Motorways.filter(ele => ele.index !== index)
633
+ this.motorid = this.increaseId(this.Motorways, 'id')
634
+ break
635
+ case 'ped':
636
+ this.Pedwalk = this.Pedwalk.filter(ele => ele.index !== index)
637
+ this.pedid = this.increaseId(this.Pedwalk, 'id')
638
+ break
639
+ case 'countdown':
640
+ this.Countdown = this.Countdown.filter(ele => ele.index !== index)
641
+ break
642
+ case 'detector':
643
+ this.Detector = this.Detector.filter(ele => ele.index !== index)
644
+ // this.DetectorChart = this.DetectorChart.filter(ele => ele.id !== id)
645
+ this.detectorcoilid = this.increaseId(this.Detector, 'id')
646
+ }
647
+ this.curChooseIconIndex = -1
648
+ this.curChooseIcon = {}
649
+ },
650
+ cloneItem (row) {
651
+ // 克隆元素
652
+ let cloneObj = {
653
+ ...row,
654
+ index: this.index,
655
+ x: 435,
656
+ y: 325
657
+ }
658
+ switch (row.icontype) {
659
+ case 'vehile':
660
+ cloneObj.id = this.motorid
661
+ this.Motorways.push(cloneObj)
662
+ this.motorid = this.increaseId(this.Motorways, 'id')
663
+ this.customlist.push(cloneObj)
664
+ break
665
+ case 'ped':
666
+ cloneObj.id = this.pedid
667
+ this.Pedwalk.push(cloneObj)
668
+ this.pedid = this.increaseId(this.Pedwalk, 'id')
669
+ this.customlist.push(cloneObj)
670
+ break
671
+ // case 'countdown':
672
+ // this.Countdown.push(cloneObj)
673
+ // this.customlist.push(cloneObj)
674
+ // break
675
+ case 'detector':
676
+ cloneObj.id = this.detectorcoilid
677
+ this.Detector.push(cloneObj)
678
+ this.customlist.push(cloneObj)
679
+ // 同时克隆统计图
680
+ // this.index = this.increaseId(this.customlist, 'index')
681
+ // let curchartobj = JSON.parse(JSON.stringify(this.DetectorChart)).filter(ele => ele.id === row.id)[0]
682
+ // curchartobj.index = this.index
683
+ // curchartobj.id = this.detectorcoilid
684
+ // curchartobj.x = 435
685
+ // curchartobj.y = 325 - 100
686
+ // this.DetectorChart.push(curchartobj)
687
+ // this.customlist.push(curchartobj)
688
+ this.detectorcoilid = this.increaseId(this.Detector, 'id')
689
+ }
690
+ this.curChooseIconIndex = this.index
691
+ this.curChooseIcon = JSON.parse(JSON.stringify(cloneObj))
692
+ this.index = this.increaseId(this.customlist, 'index')
693
+ },
694
+
695
+ loadSvgString (type, imgstr) {
696
+ // 加载用户上传的底图svg字符串
697
+ if (type === 'vectorgraph') {
698
+ // 导入矢量图
699
+ // this.getCrossMapViewbox(imgstr)
700
+ this.CrossMapData = {
701
+ ...this.CrossMapData,
702
+ type,
703
+ svgstr: imgstr
704
+ }
705
+ }
706
+ if (type === 'picture') {
707
+ // 导入图片
708
+ this.CrossMapData = {
709
+ ...this.CrossMapData,
710
+ type,
711
+ imgfilesrc: imgstr
712
+ }
713
+ }
714
+ },
715
+ loadMapSize (type, mapsize) {
716
+ this.CrossMapData = {
717
+ ...this.CrossMapData,
718
+ angle: 0,
719
+ x: Math.round(mapsize.width / 2),
720
+ y: Math.round(mapsize.height / 2),
721
+ w: Math.round(mapsize.width),
722
+ h: Math.round(mapsize.height)
723
+ }
724
+ this.MapW = mapsize.width
725
+ this.MapH = mapsize.height
726
+ },
727
+
728
+ getCrossMapViewbox (svgstr) {
729
+ // 获取户上传svg的viewBox属性的大小
730
+ let arr = svgstr.split('"')
731
+ let index, viewBox
732
+ for (let i = 0; i < arr.length - 1; i++) {
733
+ if (arr[i].indexOf('viewBox') !== -1) {
734
+ index = i
735
+ }
736
+ }
737
+ if (index) {
738
+ viewBox = arr[index + 1]
739
+ }
740
+ this.MapW = Number(viewBox.split(' ')[2])
741
+ this.MapH = Number(viewBox.split(' ')[3])
742
+ },
743
+ changeCrossMap (mapdata, fields) {
744
+ this.changeItem(mapdata, fields, [this.CrossMapData])
745
+ },
746
+
747
+ // 重置
748
+ handleReset () {
749
+ this.customlist = []
750
+ this.Texts = []
751
+ this.Motorways = []
752
+ this.Countdown = []
753
+ this.Pedwalk = []
754
+ this.Detector = []
755
+ this.DetectorChart = []
756
+ this.CrossMapData = {
757
+ index: -2, // 暂定为-2,用于复用图标判断逻辑
758
+ icontype: 'crossmap',
759
+ x: this.MapW / 2,
760
+ y: this.MapH / 2,
761
+ w: this.MapW,
762
+ h: this.MapH,
763
+ angle: 0,
764
+ svgstr: '',
765
+ imgfilesrc: ''
766
+ }
767
+ this.index = 0
768
+ this.curChooseIcon = {}
769
+ },
770
+ // 取消
771
+ cancledraw () {
772
+ this.canclesettingvisible = true
773
+ },
774
+ completeSetting () {
775
+ this.canclesettingvisible = false
776
+ this.$router.push('/overview/index')
777
+ },
778
+ cancleSetting () {
779
+ this.canclesettingvisible = false
780
+ },
781
+ handleSaveParams () {
782
+ let temp = {}
783
+ console.log(this.customlist)
784
+ for (const item of this.customlist) {
785
+ if (temp.hasOwnProperty(item.icontype)) {
786
+ temp[item.icontype].push(item)
787
+ } else {
788
+ temp[item.icontype] = [item]
789
+ }
790
+ }
791
+ if (this.CrossMapData.svgstr !== '' || this.CrossMapData.imgfilesrc !== '') {
792
+ temp.crossMap = this.CrossMapData
793
+ }
794
+ return temp
795
+ },
796
+ // 保存
797
+ savedraw () {
798
+ let temp = {}
799
+ temp = this.handleSaveParams()
800
+ this.saveChannelizatonChart(temp)
801
+ },
802
+ // 加载
803
+ load (type) {
804
+ this.curChooseIconIndex = -1
805
+ let savedTemp = JSON.parse(JSON.stringify(this.LoadedChannelizatonData))
806
+ let arr = []
807
+ for (const [key, value] of Object.entries(savedTemp)) {
808
+ if (key === 'vehile') {
809
+ this.Motorways = value
810
+ }
811
+ if (key === 'text') {
812
+ this.Texts = value
813
+ }
814
+ if (key === 'ped') {
815
+ this.Pedwalk = value
816
+ }
817
+ if (key === 'countdown') {
818
+ this.Countdown = value
819
+ }
820
+ if (key === 'detector') {
821
+ this.Detector = value.filter(ele => ele.detailtype === 'detector')
822
+ // this.DetectorChart = value.filter(ele => ele.detailtype === 'detectorChart')
823
+ }
824
+ if (key === 'crossMap') {
825
+ this.CrossMapData = JSON.parse(JSON.stringify(value))
826
+ if (value.icontype === undefined) {
827
+ this.CrossMapData.icontype = 'crossmap'
828
+ }
829
+ } else {
830
+ if (value.length > 1) {
831
+ arr = [...arr, ...value]
832
+ } else {
833
+ arr.push(value[0])
834
+ }
835
+ }
836
+ }
837
+ this.customlist = JSON.parse(JSON.stringify(arr))
838
+ if (this.customlist.length > 0) {
839
+ this.index = this.increaseId(this.customlist, 'index')
840
+ }
841
+ if (this.Motorways.length > 0) {
842
+ this.motorid = this.increaseId(this.Motorways, 'id')
843
+ }
844
+ if (this.Pedwalk.length > 0) {
845
+ this.pedid = this.increaseId(this.Pedwalk, 'id')
846
+ }
847
+ if (this.Detector.length > 0) {
848
+ this.detectorcoilid = this.increaseId(this.Detector, 'id')
849
+ }
850
+ },
851
+ increaseId (arr, field) { // 实现field对应的index或者id, 在arr的基础上寻找最小的
852
+ let List = arr.map(ele => ele[field])
853
+ let i = List.length - 1
854
+ if (i >= 0) {
855
+ for (let j = 1; j <= 200; j++) {
856
+ if (!List.includes(j)) {
857
+ return j
858
+ }
859
+ }
860
+ }
861
+ },
862
+
863
+ exitEdit () {
864
+ this.isSeletable = !this.isSeletable
865
+ },
866
+
867
+ resetAddParams () {
868
+ this.AddType = ''
869
+ this.editBtnGroup = this.editBtnGroup.map(btn => {
870
+ btn.active = false
871
+ return btn
872
+ })
873
+ },
874
+ saveChannelizatonChart (ChannelizatonData) {
875
+ // let agentid = getIframdevid()
876
+ let params = {
877
+ agentid: this.AgentId,
878
+ data: ChannelizatonData
879
+ }
880
+ if (ChannelizatonData.crossMap && ChannelizatonData.crossMap.type === 'vectorgraph') {
881
+ ChannelizatonData.crossMap.imgfilesrc = ''
882
+ }
883
+ if (ChannelizatonData.crossMap && ChannelizatonData.crossMap.type === 'picture') {
884
+ ChannelizatonData.crossMap.svgstr = ''
885
+ }
886
+ saveChannelizatonChart(params).then(data => {
887
+ this.$emit('saveCallback', data)
888
+ if (!data.data.success) {
889
+ let parrenterror = getMessageByCode(data.data.code, this.$i18n.locale)
890
+ if (data.data.data) {
891
+ // 子类型错误
892
+ let childErrorCode = data.data.data.errorCode
893
+ if (childErrorCode) {
894
+ let childerror = getMessageByCode(data.data.data.errorCode, this.$i18n.locale)
895
+ this.$message.error(parrenterror + ',' + childerror)
896
+ }
897
+ } else {
898
+ this.$message.error(parrenterror)
899
+ }
900
+ return
901
+ }
902
+ let msg = this.$t('openatccomponents.common.savesucess')
903
+ this.$message({
904
+ message: msg,
905
+ type: 'success',
906
+ duration: 1 * 1000
907
+ })
908
+ })
909
+ },
910
+ handleClickSketchpad () {
911
+ // 监听画板区域点击事件,改变图标放置的位置
912
+ let sketchpadArea = document.getElementById('sketchpadArea')
913
+ let _this = this
914
+ sketchpadArea.addEventListener('click', function (e) {
915
+ if (_this.pointchange) {
916
+ document.getElementById('sketchpadArea').style.cursor =
917
+ 'url(resource/pic/icons/magnifier3.cur) 12 12,default'
918
+ _this.pointchange = false
919
+ let boundingClientLeft = document.getElementById('channelizationElements').getBoundingClientRect().left
920
+ let boundingClientTop = document.getElementById('channelizationElements').getBoundingClientRect().top
921
+ _this.setLeft = Math.round(e.clientX - boundingClientLeft) // 四舍五入
922
+ _this.setTop = Math.round(e.clientY - boundingClientTop)
923
+ if (_this.AddType === '') return
924
+ switch (_this.AddType) {
925
+ case 'motorway':
926
+ _this.addMotorwayIcon()
927
+ break
928
+ case 'pedcrossing':
929
+ _this.addPedwalkIcon()
930
+ break
931
+ case 'countdown':
932
+ _this.addTimer()
933
+ break
934
+ case 'detector':
935
+ _this.addAllDetector()
936
+ }
937
+ _this.resetAddParams()
938
+ }
939
+ })
940
+ },
941
+ handleLockCrossMap () {
942
+ this.isLockedCrossMap = !this.isLockedCrossMap
943
+ },
944
+ importFromFile () {
945
+ this.dialogVisible = true
946
+ },
947
+ readAsText () {
948
+ let _this = this
949
+ var file = document.getElementById('file').files[0]
950
+ var reader = new FileReader()
951
+ reader.async = true
952
+ // 将文件以文本形式读入页面
953
+ reader.readAsText(file)
954
+ reader.onload = function (f) {
955
+ setTimeout(() => {
956
+ _this.LoadedChannelizatonData = {}
957
+ _this.handleReset()
958
+ _this.dialogVisible = false
959
+ _this.LoadedChannelizatonData = JSON.parse(this.result)
960
+ _this.load()
961
+ _this.$alert(_this.$t('openatccomponents.channelizationmap.importfilesuccess'), { type: 'success' })
962
+ }, 50)
963
+ }
964
+ },
965
+ async exportToFile () {
966
+ let tscParam = this.handleSaveParams()
967
+ let content = new Blob([JSON.stringify(tscParam)])
968
+ // 生成url对象
969
+ let urlObject = window.URL || window.webkitURL || window
970
+ let url = urlObject.createObjectURL(content)
971
+ // 生成<a></a>DOM元素
972
+ let el = document.createElement('a')
973
+ // 链接赋值
974
+ el.href = url
975
+ el.download = 'ChanelizationParam.json'
976
+ // 必须点击否则不会下载
977
+ el.click()
978
+ // 移除链接释放资源
979
+ urlObject.revokeObjectURL(url)
980
+ }
981
+ },
982
+ mounted () {
983
+ this.handleClickSketchpad()
984
+ }
985
+ }
986
+ </script>
987
+
988
+ <style lang="css" rel="stylesheet/scss">
989
+ </style>