openatc-components 0.1.9 → 0.1.11

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