openatc-components 0.1.22 → 0.1.24

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 (384) 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 +486 -486
  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 +1002 -1002
  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.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 +920 -920
  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 +159 -159
  98. package/package/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +521 -521
  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 +779 -779
  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 +226 -226
  121. package/package/kisscomps/components/SchemeConfig/priorityControl/index.vue +201 -201
  122. package/package/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  123. package/package/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +275 -275
  124. package/package/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +574 -574
  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 +175 -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 +687 -687
  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 +109 -109
  138. package/package/kissui.min.js +1 -1
  139. package/package.json +126 -126
  140. package/pnpm-lock.yaml +12343 -0
  141. package/src/App.vue +24 -24
  142. package/src/EdgeMgr/EdgeModelBase.js +16 -16
  143. package/src/EdgeMgr/controller/crossDiagramMgr.js +120 -120
  144. package/src/api/authapi.js +31 -31
  145. package/src/api/config.js +21 -21
  146. package/src/api/control.js +76 -76
  147. package/src/api/cross.js +33 -33
  148. package/src/api/fault.js +66 -66
  149. package/src/api/index.js +24 -24
  150. package/src/api/login.js +46 -46
  151. package/src/api/optimize.js +72 -72
  152. package/src/api/param.js +154 -154
  153. package/src/api/passwdAssest.js +101 -101
  154. package/src/api/template.js +27 -27
  155. package/src/i18n/index.js +26 -26
  156. package/src/i18n/language/en.js +1228 -1228
  157. package/src/i18n/language/index.js +25 -25
  158. package/src/i18n/language/zh.js +1227 -1227
  159. package/src/icons/demo.css +539 -539
  160. package/src/icons/iconfont.css +835 -835
  161. package/src/icons/iconfont.json +1444 -1444
  162. package/src/icons/index.js +20 -20
  163. package/src/icons/svg/bendi.svg +110 -110
  164. package/src/icons/svg/bujin.svg +36 -36
  165. package/src/icons/svg/connectBlue.svg +7 -7
  166. package/src/icons/svg/currentvolume.svg +0 -0
  167. package/src/icons/svg/custom-BRTlane.svg +40 -40
  168. package/src/icons/svg/custom-buslane.svg +40 -40
  169. package/src/icons/svg/custom-detector.svg +12 -12
  170. package/src/icons/svg/custom-east-bottom.svg +32 -32
  171. package/src/icons/svg/custom-east-top.svg +32 -32
  172. package/src/icons/svg/custom-ewped.svg +35 -35
  173. package/src/icons/svg/custom-nonmotorizedlane.svg +40 -40
  174. package/src/icons/svg/custom-north-left.svg +32 -32
  175. package/src/icons/svg/custom-north-right.svg +32 -32
  176. package/src/icons/svg/custom-peddetector.svg +17 -17
  177. package/src/icons/svg/custom-snped.svg +35 -35
  178. package/src/icons/svg/custom-south-left.svg +32 -32
  179. package/src/icons/svg/custom-south-right.svg +32 -32
  180. package/src/icons/svg/custom-tramlane.svg +40 -40
  181. package/src/icons/svg/custom-vehiclebranch.svg +40 -40
  182. package/src/icons/svg/custom-vehiclemainroad.svg +41 -41
  183. package/src/icons/svg/custom-west-bottom.svg +32 -32
  184. package/src/icons/svg/custom-west-top.svg +32 -32
  185. package/src/icons/svg/custom-xlped.svg +14 -14
  186. package/src/icons/svg/custom-xrped.svg +14 -14
  187. package/src/icons/svg/cutRed.svg +7 -7
  188. package/src/icons/svg/cycle.svg +0 -0
  189. package/src/icons/svg/dingzhouqi.svg +34 -34
  190. package/src/icons/svg/ganyingkongzhi.svg +30 -30
  191. package/src/icons/svg/guandeng.svg +81 -81
  192. package/src/icons/svg/huangshan.svg +71 -71
  193. package/src/icons/svg/maincontrol.svg +0 -0
  194. package/src/icons/svg/manualcontrolbackground.svg +51 -51
  195. package/src/icons/svg/manualcontrolbackground1.svg +62 -62
  196. package/src/icons/svg/manualcontrolbackgrounden.svg +62 -62
  197. package/src/icons/svg/model.svg +0 -0
  198. package/src/icons/svg/phasediff.svg +0 -0
  199. package/src/icons/svg/quanhong.svg +86 -86
  200. package/src/icons/svg/shanghe.svg +11 -11
  201. package/src/icons/svg/shoudong.svg +103 -103
  202. package/src/icons/svg/time.svg +0 -0
  203. package/src/icons/svg/wuxianlan.svg +46 -46
  204. package/src/icons/svg/xiala.svg +11 -11
  205. package/src/icons/svg/xingrenguojie.svg +33 -33
  206. package/src/icons/svg/xitong.svg +89 -89
  207. package/src/icons/svg/youxian.svg +41 -41
  208. package/src/icons/svg/zizhukongzhi.svg +43 -43
  209. package/src/kisscomps/components/BoardCard/BoardCard.vue +94 -94
  210. package/src/kisscomps/components/BoardCard/index.js +2 -2
  211. package/src/kisscomps/components/Channelization/Channelization.vue +544 -544
  212. package/src/kisscomps/components/Channelization/index.js +2 -2
  213. package/src/kisscomps/components/ChannelizationFlowStatistic/ChannelizationFlowStatistic.vue +349 -349
  214. package/src/kisscomps/components/ChannelizationFlowStatistic/index.js +2 -2
  215. package/src/kisscomps/components/ChannelizationWithInterface/ChannelizationWithInterface.vue +486 -486
  216. package/src/kisscomps/components/ChannelizationWithInterface/index.js +2 -2
  217. package/src/kisscomps/components/CommonKanban/CommonKanban.vue +118 -118
  218. package/src/kisscomps/components/CommonKanban/index.js +2 -2
  219. package/src/kisscomps/components/DrawChannelization/drawsvg/basicCoordInfo.vue +165 -165
  220. package/src/kisscomps/components/DrawChannelization/drawsvg/channelizationElements.vue +255 -255
  221. package/src/kisscomps/components/DrawChannelization/drawsvg/detectorAssociatedComponent.vue +152 -152
  222. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/TextBox.vue +91 -91
  223. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/crossMap.vue +194 -194
  224. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/editText.vue +108 -108
  225. package/src/kisscomps/components/DrawChannelization/drawsvg/firstImportCrossmap.vue +51 -51
  226. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/countdownSvg.vue +236 -236
  227. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorChart.vue +247 -247
  228. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorIconSvg.vue +210 -210
  229. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/laneIcon.vue +72 -72
  230. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +455 -455
  231. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/pedroadIconSvg.vue +219 -219
  232. package/src/kisscomps/components/DrawChannelization/drawsvg/importDialog.vue +74 -74
  233. package/src/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +1002 -1002
  234. package/src/kisscomps/components/DrawChannelization/drawsvg/index.vue +110 -110
  235. package/src/kisscomps/components/DrawChannelization/drawsvg/laneEditPanel.vue +699 -699
  236. package/src/kisscomps/components/DrawChannelization/drawsvg/overlapAssociatedComponent.vue +157 -157
  237. package/src/kisscomps/components/DrawChannelization/drawsvg/phaseAssociatedComponent.vue +157 -157
  238. package/src/kisscomps/components/DrawChannelization/drawsvg/table.vue +99 -99
  239. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/loadutils.js +87 -87
  240. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phaseDataModel.js +32 -32
  241. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phasePos.json +20 -20
  242. package/src/kisscomps/components/DrawChannelization/index.js +2 -2
  243. package/src/kisscomps/components/DrawChannelization/phaseDataMgr.js +278 -278
  244. package/src/kisscomps/components/ExpendConfig/ExpendConfig.vue +114 -114
  245. package/src/kisscomps/components/ExpendConfig/index.js +2 -2
  246. package/src/kisscomps/components/FaultDetailModal/FaultDetailModal.vue +170 -170
  247. package/src/kisscomps/components/FaultDetailModal/index.js +2 -2
  248. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CrossRoadsSvg.vue +497 -497
  249. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CustomRoadsSvg.vue +46 -46
  250. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionEWSvg.vue +300 -300
  251. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionSNSvg.vue +288 -288
  252. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampEastSvg.vue +391 -391
  253. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampNorthSvg.vue +336 -336
  254. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampSouthSvg.vue +345 -345
  255. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampWestSvg.vue +389 -389
  256. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkSvg.vue +1179 -1179
  257. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeEastRoadsSvg.vue +402 -402
  258. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeNorthRoadsSvg.vue +361 -361
  259. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeSouthRoadsSvg.vue +368 -368
  260. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeWestRoadsSvg.vue +475 -475
  261. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LCrossRoadsSvg.vue +494 -494
  262. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeEastRoadsSvg.vue +401 -401
  263. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeNorthRoadsSvg.vue +360 -360
  264. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeSouthRoadsSvg.vue +367 -367
  265. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeWestRoadsSvg.vue +476 -476
  266. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/refreshSvg.vue +63 -63
  267. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/busMapSvg.vue +50 -50
  268. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/eastBusSvg.vue +167 -167
  269. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/northBusSvg.vue +168 -168
  270. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/southBusSvg.vue +168 -168
  271. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/westBusSvg.vue +169 -169
  272. package/src/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +920 -920
  273. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/LphaseIconSvg.vue +112 -112
  274. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/phaseIconSvg.vue +112 -112
  275. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/rampPhaseIconSvg.vue +111 -111
  276. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.json +196 -196
  277. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.left.json +196 -196
  278. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.json +99 -99
  279. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.left.json +99 -99
  280. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/rampPos.json +52 -52
  281. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/sidePos.json +99 -99
  282. package/src/kisscomps/components/IntersectionMap/crossDirection/utils.js +78 -78
  283. package/src/kisscomps/components/IntersectionMap/index.js +2 -2
  284. package/src/kisscomps/components/IntersectionMap/intersectionmap.vue +159 -159
  285. package/src/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +521 -521
  286. package/src/kisscomps/components/IntersectionWithInterface/index.js +2 -2
  287. package/src/kisscomps/components/KanBan/index.js +2 -2
  288. package/src/kisscomps/components/KanBan/kanban.vue +219 -219
  289. package/src/kisscomps/components/MessageBox/index.vue +96 -96
  290. package/src/kisscomps/components/OverLap/OverLap.vue +207 -207
  291. package/src/kisscomps/components/OverLap/index.js +2 -2
  292. package/src/kisscomps/components/PatternStatus/PatternStatus.vue +962 -962
  293. package/src/kisscomps/components/PatternStatus/index.js +2 -2
  294. package/src/kisscomps/components/PatternWalkSvg/PatternWalkSvg.vue +423 -423
  295. package/src/kisscomps/components/PatternWalkSvg/index.js +2 -2
  296. package/src/kisscomps/components/PhaseMarker/index.js +6 -6
  297. package/src/kisscomps/components/PhaseMarker/phasemarker.vue +215 -215
  298. package/src/kisscomps/components/PhaseMarker/svg/patternSvg.vue +121 -121
  299. package/src/kisscomps/components/PhaseMarker/svg/phase.vue +60 -60
  300. package/src/kisscomps/components/PhaseMarker/svg/phaseCount.vue +62 -62
  301. package/src/kisscomps/components/PhaseMarker/svg/phaseCountCycle.vue +62 -62
  302. package/src/kisscomps/components/PhaseMarker/svg/phaseSvg.vue +117 -117
  303. package/src/kisscomps/components/SchemeConfig/SchemeConfig.vue +779 -779
  304. package/src/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +195 -195
  305. package/src/kisscomps/components/SchemeConfig/index.js +2 -2
  306. package/src/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +198 -198
  307. package/src/kisscomps/components/SchemeConfig/manualControlModal/index.vue +226 -226
  308. package/src/kisscomps/components/SchemeConfig/priorityControl/index.vue +201 -201
  309. package/src/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  310. package/src/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +275 -275
  311. package/src/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +574 -574
  312. package/src/kisscomps/components/StageBord/StageBord.vue +242 -242
  313. package/src/kisscomps/components/StageBord/index.js +2 -2
  314. package/src/kisscomps/components/StageStatus/StageStatus.vue +310 -310
  315. package/src/kisscomps/components/StageStatus/index.js +2 -2
  316. package/src/kisscomps/components/Stages/index.vue +175 -139
  317. package/src/kisscomps/components/SvgIcon/SvgIcon.vue +53 -53
  318. package/src/kisscomps/components/SvgIcon/index.js +2 -2
  319. package/src/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +522 -522
  320. package/src/kisscomps/components/XRDDirSelector/index.js +2 -2
  321. package/src/kisscomps/components/overView/index.vue +687 -687
  322. package/src/kisscomps/components/patternList/index.js +2 -2
  323. package/src/kisscomps/components/patternList/patternList.vue +567 -567
  324. package/src/kisscomps/index.js +109 -109
  325. package/src/lib/publicjs/ArryListUtil.js +38 -38
  326. package/src/lib/publicjs/HttpurlMgr.js +45 -45
  327. package/src/lib/publicjs/KissApi.js +158 -158
  328. package/src/lib/publicjs/KissWSSub/Heartcheck.js +128 -128
  329. package/src/lib/publicjs/KissWSSub/KissWsSub.js +91 -91
  330. package/src/lib/publicjs/KissWSSub/KissWsSubByType.js +152 -152
  331. package/src/lib/publicjs/KissWSSub/SimuWsSubByType.js +44 -44
  332. package/src/lib/publicjs/KissWSSub/Sub.js +51 -51
  333. package/src/lib/publicjs/KissWSSub/SubChannel.js +119 -119
  334. package/src/lib/publicjs/basecomponents.js +65 -65
  335. package/src/lib/publicjs/localStorage.js +112 -112
  336. package/src/lib/publicjs/objdeepcopy.js +32 -32
  337. package/src/lib/publicjs/pageScroll.js +30 -30
  338. package/src/lib/publicjs/passwdAssest.js +101 -101
  339. package/src/lib/publicjs/styleclassfactory.js +32 -32
  340. package/src/main.js +50 -50
  341. package/src/router/index.js +42 -42
  342. package/src/store/getters.js +16 -16
  343. package/src/store/index.js +26 -26
  344. package/src/store/modules/globalParam.js +67 -67
  345. package/src/utils/ControlFormat.js +68 -68
  346. package/src/utils/RingDataModel.js +191 -191
  347. package/src/utils/auth.js +178 -178
  348. package/src/utils/dateFormat.js +41 -41
  349. package/src/utils/errorcode.js +224 -224
  350. package/src/utils/fault.js +195 -195
  351. package/src/utils/faultcode.js +209 -209
  352. package/src/utils/index.js +69 -69
  353. package/src/utils/pedphasedesc.js +119 -119
  354. package/src/utils/phasedesc.js +124 -124
  355. package/src/utils/responseMessage.js +21 -21
  356. package/src/utils/validate.js +43 -43
  357. package/src/views/customchannelization.vue +49 -49
  358. package/src/views/home.1.vue +479 -479
  359. package/src/views/home.vue +78 -78
  360. package/src/views/intersection.vue +309 -309
  361. package/src/views/overView.vue +41 -41
  362. package/src/views/schemeconfig.vue +165 -165
  363. package/static/apiconfig.json +351 -351
  364. package/static/styles/channelizatioon.scss +414 -414
  365. package/static/styles/common.scss +20 -20
  366. package/static/styles/commonkanban.scss +87 -87
  367. package/static/styles/dark/index.scss +2 -2
  368. package/static/styles/dark/theme/element-dark.scss +42 -42
  369. package/static/styles/index.scss +84 -84
  370. package/static/styles/intersection.scss +170 -170
  371. package/static/styles/light/index.scss +2 -2
  372. package/static/styles/light/theme/element-light.scss +42 -42
  373. package/static/styles/overview.scss +371 -371
  374. package/static/styles/schemeconfig.scss +457 -457
  375. package/static/styles/stages.scss +64 -64
  376. package/static/token.json +2 -2
  377. package/test/e2e/custom-assertions/elementCount.js +27 -27
  378. package/test/e2e/nightwatch.conf.js +46 -46
  379. package/test/e2e/runner.js +48 -48
  380. package/test/e2e/specs/test.js +19 -19
  381. package/test/unit/.eslintrc +7 -7
  382. package/test/unit/jest.conf.js +30 -30
  383. package/test/unit/setup.js +3 -3
  384. package/test/unit/specs/HelloWorld.spec.js +11 -11
@@ -1,1002 +1,1002 @@
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
- this.deleteLaneAssociatedDetector(row.id)
638
- break
639
- case 'ped':
640
- this.Pedwalk = this.Pedwalk.filter(ele => ele.index !== index)
641
- this.pedid = this.increaseId(this.Pedwalk, 'id')
642
- break
643
- case 'countdown':
644
- this.Countdown = this.Countdown.filter(ele => ele.index !== index)
645
- break
646
- case 'detector':
647
- this.Detector = this.Detector.filter(ele => ele.index !== index)
648
- // this.DetectorChart = this.DetectorChart.filter(ele => ele.id !== id)
649
- this.detectorcoilid = this.increaseId(this.Detector, 'id')
650
- }
651
- this.curChooseIconIndex = -1
652
- this.curChooseIcon = {}
653
- },
654
- deleteLaneAssociatedDetector (dellaneid) {
655
- // 删除关联车道的检测器的历史关联关系
656
- for (let i = 0; i < this.Detector.length; i++) {
657
- let curDetc = this.Detector[i]
658
- if (curDetc.associatedlaneid === dellaneid) {
659
- curDetc.associatedlaneid = undefined
660
- }
661
- }
662
- },
663
- cloneItem (row) {
664
- // 克隆元素
665
- let cloneObj = {
666
- ...row,
667
- index: this.index,
668
- x: 435,
669
- y: 325
670
- }
671
- switch (row.icontype) {
672
- case 'vehile':
673
- cloneObj.id = this.motorid
674
- this.Motorways.push(cloneObj)
675
- this.motorid = this.increaseId(this.Motorways, 'id')
676
- this.customlist.push(cloneObj)
677
- break
678
- case 'ped':
679
- cloneObj.id = this.pedid
680
- this.Pedwalk.push(cloneObj)
681
- this.pedid = this.increaseId(this.Pedwalk, 'id')
682
- this.customlist.push(cloneObj)
683
- break
684
- // case 'countdown':
685
- // this.Countdown.push(cloneObj)
686
- // this.customlist.push(cloneObj)
687
- // break
688
- case 'detector':
689
- cloneObj.id = this.detectorcoilid
690
- this.Detector.push(cloneObj)
691
- this.customlist.push(cloneObj)
692
- // 同时克隆统计图
693
- // this.index = this.increaseId(this.customlist, 'index')
694
- // let curchartobj = JSON.parse(JSON.stringify(this.DetectorChart)).filter(ele => ele.id === row.id)[0]
695
- // curchartobj.index = this.index
696
- // curchartobj.id = this.detectorcoilid
697
- // curchartobj.x = 435
698
- // curchartobj.y = 325 - 100
699
- // this.DetectorChart.push(curchartobj)
700
- // this.customlist.push(curchartobj)
701
- this.detectorcoilid = this.increaseId(this.Detector, 'id')
702
- }
703
- this.curChooseIconIndex = this.index
704
- this.curChooseIcon = JSON.parse(JSON.stringify(cloneObj))
705
- this.index = this.increaseId(this.customlist, 'index')
706
- },
707
-
708
- loadSvgString (type, imgstr) {
709
- // 加载用户上传的底图svg字符串
710
- if (type === 'vectorgraph') {
711
- // 导入矢量图
712
- // this.getCrossMapViewbox(imgstr)
713
- this.CrossMapData = {
714
- ...this.CrossMapData,
715
- type,
716
- svgstr: imgstr
717
- }
718
- }
719
- if (type === 'picture') {
720
- // 导入图片
721
- this.CrossMapData = {
722
- ...this.CrossMapData,
723
- type,
724
- imgfilesrc: imgstr
725
- }
726
- }
727
- },
728
- loadMapSize (type, mapsize) {
729
- this.CrossMapData = {
730
- ...this.CrossMapData,
731
- angle: 0,
732
- x: Math.round(mapsize.width / 2),
733
- y: Math.round(mapsize.height / 2),
734
- w: Math.round(mapsize.width),
735
- h: Math.round(mapsize.height)
736
- }
737
- this.MapW = mapsize.width
738
- this.MapH = mapsize.height
739
- },
740
-
741
- getCrossMapViewbox (svgstr) {
742
- // 获取户上传svg的viewBox属性的大小
743
- let arr = svgstr.split('"')
744
- let index, viewBox
745
- for (let i = 0; i < arr.length - 1; i++) {
746
- if (arr[i].indexOf('viewBox') !== -1) {
747
- index = i
748
- }
749
- }
750
- if (index) {
751
- viewBox = arr[index + 1]
752
- }
753
- this.MapW = Number(viewBox.split(' ')[2])
754
- this.MapH = Number(viewBox.split(' ')[3])
755
- },
756
- changeCrossMap (mapdata, fields) {
757
- this.changeItem(mapdata, fields, [this.CrossMapData])
758
- },
759
-
760
- // 重置
761
- handleReset () {
762
- this.customlist = []
763
- this.Texts = []
764
- this.Motorways = []
765
- this.Countdown = []
766
- this.Pedwalk = []
767
- this.Detector = []
768
- this.DetectorChart = []
769
- this.CrossMapData = {
770
- index: -2, // 暂定为-2,用于复用图标判断逻辑
771
- icontype: 'crossmap',
772
- x: this.MapW / 2,
773
- y: this.MapH / 2,
774
- w: this.MapW,
775
- h: this.MapH,
776
- angle: 0,
777
- svgstr: '',
778
- imgfilesrc: ''
779
- }
780
- this.index = 0
781
- this.curChooseIcon = {}
782
- },
783
- // 取消
784
- cancledraw () {
785
- this.canclesettingvisible = true
786
- },
787
- completeSetting () {
788
- this.canclesettingvisible = false
789
- this.$router.push('/overview/index')
790
- },
791
- cancleSetting () {
792
- this.canclesettingvisible = false
793
- },
794
- handleSaveParams () {
795
- let temp = {}
796
- console.log(this.customlist)
797
- for (const item of this.customlist) {
798
- if (temp.hasOwnProperty(item.icontype)) {
799
- temp[item.icontype].push(item)
800
- } else {
801
- temp[item.icontype] = [item]
802
- }
803
- }
804
- if (this.CrossMapData.svgstr !== '' || this.CrossMapData.imgfilesrc !== '') {
805
- temp.crossMap = this.CrossMapData
806
- }
807
- return temp
808
- },
809
- // 保存
810
- savedraw () {
811
- let temp = {}
812
- temp = this.handleSaveParams()
813
- this.saveChannelizatonChart(temp)
814
- },
815
- // 加载
816
- load (type) {
817
- this.curChooseIconIndex = -1
818
- let savedTemp = JSON.parse(JSON.stringify(this.LoadedChannelizatonData))
819
- let arr = []
820
- for (const [key, value] of Object.entries(savedTemp)) {
821
- if (key === 'vehile') {
822
- this.Motorways = value
823
- }
824
- if (key === 'text') {
825
- this.Texts = value
826
- }
827
- if (key === 'ped') {
828
- this.Pedwalk = value
829
- }
830
- if (key === 'countdown') {
831
- this.Countdown = value
832
- }
833
- if (key === 'detector') {
834
- this.Detector = value.filter(ele => ele.detailtype === 'detector')
835
- // this.DetectorChart = value.filter(ele => ele.detailtype === 'detectorChart')
836
- }
837
- if (key === 'crossMap') {
838
- this.CrossMapData = JSON.parse(JSON.stringify(value))
839
- if (value.icontype === undefined) {
840
- this.CrossMapData.icontype = 'crossmap'
841
- }
842
- } else {
843
- if (value.length > 1) {
844
- arr = [...arr, ...value]
845
- } else {
846
- arr.push(value[0])
847
- }
848
- }
849
- }
850
- this.customlist = JSON.parse(JSON.stringify(arr))
851
- if (this.customlist.length > 0) {
852
- this.index = this.increaseId(this.customlist, 'index')
853
- }
854
- if (this.Motorways.length > 0) {
855
- this.motorid = this.increaseId(this.Motorways, 'id')
856
- }
857
- if (this.Pedwalk.length > 0) {
858
- this.pedid = this.increaseId(this.Pedwalk, 'id')
859
- }
860
- if (this.Detector.length > 0) {
861
- this.detectorcoilid = this.increaseId(this.Detector, 'id')
862
- }
863
- },
864
- increaseId (arr, field) { // 实现field对应的index或者id, 在arr的基础上寻找最小的
865
- let List = arr.map(ele => ele[field])
866
- let i = List.length - 1
867
- if (i >= 0) {
868
- for (let j = 1; j <= 200; j++) {
869
- if (!List.includes(j)) {
870
- return j
871
- }
872
- }
873
- }
874
- },
875
-
876
- exitEdit () {
877
- this.isSeletable = !this.isSeletable
878
- },
879
-
880
- resetAddParams () {
881
- this.AddType = ''
882
- this.editBtnGroup = this.editBtnGroup.map(btn => {
883
- btn.active = false
884
- return btn
885
- })
886
- },
887
- saveChannelizatonChart (ChannelizatonData) {
888
- // let agentid = getIframdevid()
889
- let params = {
890
- agentid: this.AgentId,
891
- data: ChannelizatonData
892
- }
893
- if (ChannelizatonData.crossMap && ChannelizatonData.crossMap.type === 'vectorgraph') {
894
- ChannelizatonData.crossMap.imgfilesrc = ''
895
- }
896
- if (ChannelizatonData.crossMap && ChannelizatonData.crossMap.type === 'picture') {
897
- ChannelizatonData.crossMap.svgstr = ''
898
- }
899
- saveChannelizatonChart(params).then(data => {
900
- this.$emit('saveCallback', data)
901
- if (!data.data.success) {
902
- let parrenterror = getMessageByCode(data.data.code, this.$i18n.locale)
903
- if (data.data.data) {
904
- // 子类型错误
905
- let childErrorCode = data.data.data.errorCode
906
- if (childErrorCode) {
907
- let childerror = getMessageByCode(data.data.data.errorCode, this.$i18n.locale)
908
- this.$message.error(parrenterror + ',' + childerror)
909
- }
910
- } else {
911
- this.$message.error(parrenterror)
912
- }
913
- return
914
- }
915
- let msg = this.$t('openatccomponents.common.savesucess')
916
- this.$message({
917
- message: msg,
918
- type: 'success',
919
- duration: 1 * 1000
920
- })
921
- })
922
- },
923
- handleClickSketchpad () {
924
- // 监听画板区域点击事件,改变图标放置的位置
925
- let sketchpadArea = document.getElementById('sketchpadArea')
926
- let _this = this
927
- sketchpadArea.addEventListener('click', function (e) {
928
- if (_this.pointchange) {
929
- document.getElementById('sketchpadArea').style.cursor =
930
- 'url(resource/pic/icons/magnifier3.cur) 12 12,default'
931
- _this.pointchange = false
932
- let boundingClientLeft = document.getElementById('channelizationElements').getBoundingClientRect().left
933
- let boundingClientTop = document.getElementById('channelizationElements').getBoundingClientRect().top
934
- _this.setLeft = Math.round(e.clientX - boundingClientLeft) // 四舍五入
935
- _this.setTop = Math.round(e.clientY - boundingClientTop)
936
- if (_this.AddType === '') return
937
- switch (_this.AddType) {
938
- case 'motorway':
939
- _this.addMotorwayIcon()
940
- break
941
- case 'pedcrossing':
942
- _this.addPedwalkIcon()
943
- break
944
- case 'countdown':
945
- _this.addTimer()
946
- break
947
- case 'detector':
948
- _this.addAllDetector()
949
- }
950
- _this.resetAddParams()
951
- }
952
- })
953
- },
954
- handleLockCrossMap () {
955
- this.isLockedCrossMap = !this.isLockedCrossMap
956
- },
957
- importFromFile () {
958
- this.dialogVisible = true
959
- },
960
- readAsText () {
961
- let _this = this
962
- var file = document.getElementById('file').files[0]
963
- var reader = new FileReader()
964
- reader.async = true
965
- // 将文件以文本形式读入页面
966
- reader.readAsText(file)
967
- reader.onload = function (f) {
968
- setTimeout(() => {
969
- _this.LoadedChannelizatonData = {}
970
- _this.handleReset()
971
- _this.dialogVisible = false
972
- _this.LoadedChannelizatonData = JSON.parse(this.result)
973
- _this.load()
974
- _this.$alert(_this.$t('openatccomponents.channelizationmap.importfilesuccess'), { type: 'success' })
975
- }, 50)
976
- }
977
- },
978
- async exportToFile () {
979
- let tscParam = this.handleSaveParams()
980
- let content = new Blob([JSON.stringify(tscParam)])
981
- // 生成url对象
982
- let urlObject = window.URL || window.webkitURL || window
983
- let url = urlObject.createObjectURL(content)
984
- // 生成<a></a>DOM元素
985
- let el = document.createElement('a')
986
- // 链接赋值
987
- el.href = url
988
- el.download = 'ChanelizationParam.json'
989
- // 必须点击否则不会下载
990
- el.click()
991
- // 移除链接释放资源
992
- urlObject.revokeObjectURL(url)
993
- }
994
- },
995
- mounted () {
996
- this.handleClickSketchpad()
997
- }
998
- }
999
- </script>
1000
-
1001
- <style lang="css" rel="stylesheet/scss">
1002
- </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
+ this.deleteLaneAssociatedDetector(row.id)
638
+ break
639
+ case 'ped':
640
+ this.Pedwalk = this.Pedwalk.filter(ele => ele.index !== index)
641
+ this.pedid = this.increaseId(this.Pedwalk, 'id')
642
+ break
643
+ case 'countdown':
644
+ this.Countdown = this.Countdown.filter(ele => ele.index !== index)
645
+ break
646
+ case 'detector':
647
+ this.Detector = this.Detector.filter(ele => ele.index !== index)
648
+ // this.DetectorChart = this.DetectorChart.filter(ele => ele.id !== id)
649
+ this.detectorcoilid = this.increaseId(this.Detector, 'id')
650
+ }
651
+ this.curChooseIconIndex = -1
652
+ this.curChooseIcon = {}
653
+ },
654
+ deleteLaneAssociatedDetector (dellaneid) {
655
+ // 删除关联车道的检测器的历史关联关系
656
+ for (let i = 0; i < this.Detector.length; i++) {
657
+ let curDetc = this.Detector[i]
658
+ if (curDetc.associatedlaneid === dellaneid) {
659
+ curDetc.associatedlaneid = undefined
660
+ }
661
+ }
662
+ },
663
+ cloneItem (row) {
664
+ // 克隆元素
665
+ let cloneObj = {
666
+ ...row,
667
+ index: this.index,
668
+ x: 435,
669
+ y: 325
670
+ }
671
+ switch (row.icontype) {
672
+ case 'vehile':
673
+ cloneObj.id = this.motorid
674
+ this.Motorways.push(cloneObj)
675
+ this.motorid = this.increaseId(this.Motorways, 'id')
676
+ this.customlist.push(cloneObj)
677
+ break
678
+ case 'ped':
679
+ cloneObj.id = this.pedid
680
+ this.Pedwalk.push(cloneObj)
681
+ this.pedid = this.increaseId(this.Pedwalk, 'id')
682
+ this.customlist.push(cloneObj)
683
+ break
684
+ // case 'countdown':
685
+ // this.Countdown.push(cloneObj)
686
+ // this.customlist.push(cloneObj)
687
+ // break
688
+ case 'detector':
689
+ cloneObj.id = this.detectorcoilid
690
+ this.Detector.push(cloneObj)
691
+ this.customlist.push(cloneObj)
692
+ // 同时克隆统计图
693
+ // this.index = this.increaseId(this.customlist, 'index')
694
+ // let curchartobj = JSON.parse(JSON.stringify(this.DetectorChart)).filter(ele => ele.id === row.id)[0]
695
+ // curchartobj.index = this.index
696
+ // curchartobj.id = this.detectorcoilid
697
+ // curchartobj.x = 435
698
+ // curchartobj.y = 325 - 100
699
+ // this.DetectorChart.push(curchartobj)
700
+ // this.customlist.push(curchartobj)
701
+ this.detectorcoilid = this.increaseId(this.Detector, 'id')
702
+ }
703
+ this.curChooseIconIndex = this.index
704
+ this.curChooseIcon = JSON.parse(JSON.stringify(cloneObj))
705
+ this.index = this.increaseId(this.customlist, 'index')
706
+ },
707
+
708
+ loadSvgString (type, imgstr) {
709
+ // 加载用户上传的底图svg字符串
710
+ if (type === 'vectorgraph') {
711
+ // 导入矢量图
712
+ // this.getCrossMapViewbox(imgstr)
713
+ this.CrossMapData = {
714
+ ...this.CrossMapData,
715
+ type,
716
+ svgstr: imgstr
717
+ }
718
+ }
719
+ if (type === 'picture') {
720
+ // 导入图片
721
+ this.CrossMapData = {
722
+ ...this.CrossMapData,
723
+ type,
724
+ imgfilesrc: imgstr
725
+ }
726
+ }
727
+ },
728
+ loadMapSize (type, mapsize) {
729
+ this.CrossMapData = {
730
+ ...this.CrossMapData,
731
+ angle: 0,
732
+ x: Math.round(mapsize.width / 2),
733
+ y: Math.round(mapsize.height / 2),
734
+ w: Math.round(mapsize.width),
735
+ h: Math.round(mapsize.height)
736
+ }
737
+ this.MapW = mapsize.width
738
+ this.MapH = mapsize.height
739
+ },
740
+
741
+ getCrossMapViewbox (svgstr) {
742
+ // 获取户上传svg的viewBox属性的大小
743
+ let arr = svgstr.split('"')
744
+ let index, viewBox
745
+ for (let i = 0; i < arr.length - 1; i++) {
746
+ if (arr[i].indexOf('viewBox') !== -1) {
747
+ index = i
748
+ }
749
+ }
750
+ if (index) {
751
+ viewBox = arr[index + 1]
752
+ }
753
+ this.MapW = Number(viewBox.split(' ')[2])
754
+ this.MapH = Number(viewBox.split(' ')[3])
755
+ },
756
+ changeCrossMap (mapdata, fields) {
757
+ this.changeItem(mapdata, fields, [this.CrossMapData])
758
+ },
759
+
760
+ // 重置
761
+ handleReset () {
762
+ this.customlist = []
763
+ this.Texts = []
764
+ this.Motorways = []
765
+ this.Countdown = []
766
+ this.Pedwalk = []
767
+ this.Detector = []
768
+ this.DetectorChart = []
769
+ this.CrossMapData = {
770
+ index: -2, // 暂定为-2,用于复用图标判断逻辑
771
+ icontype: 'crossmap',
772
+ x: this.MapW / 2,
773
+ y: this.MapH / 2,
774
+ w: this.MapW,
775
+ h: this.MapH,
776
+ angle: 0,
777
+ svgstr: '',
778
+ imgfilesrc: ''
779
+ }
780
+ this.index = 0
781
+ this.curChooseIcon = {}
782
+ },
783
+ // 取消
784
+ cancledraw () {
785
+ this.canclesettingvisible = true
786
+ },
787
+ completeSetting () {
788
+ this.canclesettingvisible = false
789
+ this.$router.push('/overview/index')
790
+ },
791
+ cancleSetting () {
792
+ this.canclesettingvisible = false
793
+ },
794
+ handleSaveParams () {
795
+ let temp = {}
796
+ console.log(this.customlist)
797
+ for (const item of this.customlist) {
798
+ if (temp.hasOwnProperty(item.icontype)) {
799
+ temp[item.icontype].push(item)
800
+ } else {
801
+ temp[item.icontype] = [item]
802
+ }
803
+ }
804
+ if (this.CrossMapData.svgstr !== '' || this.CrossMapData.imgfilesrc !== '') {
805
+ temp.crossMap = this.CrossMapData
806
+ }
807
+ return temp
808
+ },
809
+ // 保存
810
+ savedraw () {
811
+ let temp = {}
812
+ temp = this.handleSaveParams()
813
+ this.saveChannelizatonChart(temp)
814
+ },
815
+ // 加载
816
+ load (type) {
817
+ this.curChooseIconIndex = -1
818
+ let savedTemp = JSON.parse(JSON.stringify(this.LoadedChannelizatonData))
819
+ let arr = []
820
+ for (const [key, value] of Object.entries(savedTemp)) {
821
+ if (key === 'vehile') {
822
+ this.Motorways = value
823
+ }
824
+ if (key === 'text') {
825
+ this.Texts = value
826
+ }
827
+ if (key === 'ped') {
828
+ this.Pedwalk = value
829
+ }
830
+ if (key === 'countdown') {
831
+ this.Countdown = value
832
+ }
833
+ if (key === 'detector') {
834
+ this.Detector = value.filter(ele => ele.detailtype === 'detector')
835
+ // this.DetectorChart = value.filter(ele => ele.detailtype === 'detectorChart')
836
+ }
837
+ if (key === 'crossMap') {
838
+ this.CrossMapData = JSON.parse(JSON.stringify(value))
839
+ if (value.icontype === undefined) {
840
+ this.CrossMapData.icontype = 'crossmap'
841
+ }
842
+ } else {
843
+ if (value.length > 1) {
844
+ arr = [...arr, ...value]
845
+ } else {
846
+ arr.push(value[0])
847
+ }
848
+ }
849
+ }
850
+ this.customlist = JSON.parse(JSON.stringify(arr))
851
+ if (this.customlist.length > 0) {
852
+ this.index = this.increaseId(this.customlist, 'index')
853
+ }
854
+ if (this.Motorways.length > 0) {
855
+ this.motorid = this.increaseId(this.Motorways, 'id')
856
+ }
857
+ if (this.Pedwalk.length > 0) {
858
+ this.pedid = this.increaseId(this.Pedwalk, 'id')
859
+ }
860
+ if (this.Detector.length > 0) {
861
+ this.detectorcoilid = this.increaseId(this.Detector, 'id')
862
+ }
863
+ },
864
+ increaseId (arr, field) { // 实现field对应的index或者id, 在arr的基础上寻找最小的
865
+ let List = arr.map(ele => ele[field])
866
+ let i = List.length - 1
867
+ if (i >= 0) {
868
+ for (let j = 1; j <= 200; j++) {
869
+ if (!List.includes(j)) {
870
+ return j
871
+ }
872
+ }
873
+ }
874
+ },
875
+
876
+ exitEdit () {
877
+ this.isSeletable = !this.isSeletable
878
+ },
879
+
880
+ resetAddParams () {
881
+ this.AddType = ''
882
+ this.editBtnGroup = this.editBtnGroup.map(btn => {
883
+ btn.active = false
884
+ return btn
885
+ })
886
+ },
887
+ saveChannelizatonChart (ChannelizatonData) {
888
+ // let agentid = getIframdevid()
889
+ let params = {
890
+ agentid: this.AgentId,
891
+ data: ChannelizatonData
892
+ }
893
+ if (ChannelizatonData.crossMap && ChannelizatonData.crossMap.type === 'vectorgraph') {
894
+ ChannelizatonData.crossMap.imgfilesrc = ''
895
+ }
896
+ if (ChannelizatonData.crossMap && ChannelizatonData.crossMap.type === 'picture') {
897
+ ChannelizatonData.crossMap.svgstr = ''
898
+ }
899
+ saveChannelizatonChart(params).then(data => {
900
+ this.$emit('saveCallback', data)
901
+ if (!data.data.success) {
902
+ let parrenterror = getMessageByCode(data.data.code, this.$i18n.locale)
903
+ if (data.data.data) {
904
+ // 子类型错误
905
+ let childErrorCode = data.data.data.errorCode
906
+ if (childErrorCode) {
907
+ let childerror = getMessageByCode(data.data.data.errorCode, this.$i18n.locale)
908
+ this.$message.error(parrenterror + ',' + childerror)
909
+ }
910
+ } else {
911
+ this.$message.error(parrenterror)
912
+ }
913
+ return
914
+ }
915
+ let msg = this.$t('openatccomponents.common.savesucess')
916
+ this.$message({
917
+ message: msg,
918
+ type: 'success',
919
+ duration: 1 * 1000
920
+ })
921
+ })
922
+ },
923
+ handleClickSketchpad () {
924
+ // 监听画板区域点击事件,改变图标放置的位置
925
+ let sketchpadArea = document.getElementById('sketchpadArea')
926
+ let _this = this
927
+ sketchpadArea.addEventListener('click', function (e) {
928
+ if (_this.pointchange) {
929
+ document.getElementById('sketchpadArea').style.cursor =
930
+ 'url(resource/pic/icons/magnifier3.cur) 12 12,default'
931
+ _this.pointchange = false
932
+ let boundingClientLeft = document.getElementById('channelizationElements').getBoundingClientRect().left
933
+ let boundingClientTop = document.getElementById('channelizationElements').getBoundingClientRect().top
934
+ _this.setLeft = Math.round(e.clientX - boundingClientLeft) // 四舍五入
935
+ _this.setTop = Math.round(e.clientY - boundingClientTop)
936
+ if (_this.AddType === '') return
937
+ switch (_this.AddType) {
938
+ case 'motorway':
939
+ _this.addMotorwayIcon()
940
+ break
941
+ case 'pedcrossing':
942
+ _this.addPedwalkIcon()
943
+ break
944
+ case 'countdown':
945
+ _this.addTimer()
946
+ break
947
+ case 'detector':
948
+ _this.addAllDetector()
949
+ }
950
+ _this.resetAddParams()
951
+ }
952
+ })
953
+ },
954
+ handleLockCrossMap () {
955
+ this.isLockedCrossMap = !this.isLockedCrossMap
956
+ },
957
+ importFromFile () {
958
+ this.dialogVisible = true
959
+ },
960
+ readAsText () {
961
+ let _this = this
962
+ var file = document.getElementById('file').files[0]
963
+ var reader = new FileReader()
964
+ reader.async = true
965
+ // 将文件以文本形式读入页面
966
+ reader.readAsText(file)
967
+ reader.onload = function (f) {
968
+ setTimeout(() => {
969
+ _this.LoadedChannelizatonData = {}
970
+ _this.handleReset()
971
+ _this.dialogVisible = false
972
+ _this.LoadedChannelizatonData = JSON.parse(this.result)
973
+ _this.load()
974
+ _this.$alert(_this.$t('openatccomponents.channelizationmap.importfilesuccess'), { type: 'success' })
975
+ }, 50)
976
+ }
977
+ },
978
+ async exportToFile () {
979
+ let tscParam = this.handleSaveParams()
980
+ let content = new Blob([JSON.stringify(tscParam)])
981
+ // 生成url对象
982
+ let urlObject = window.URL || window.webkitURL || window
983
+ let url = urlObject.createObjectURL(content)
984
+ // 生成<a></a>DOM元素
985
+ let el = document.createElement('a')
986
+ // 链接赋值
987
+ el.href = url
988
+ el.download = 'ChanelizationParam.json'
989
+ // 必须点击否则不会下载
990
+ el.click()
991
+ // 移除链接释放资源
992
+ urlObject.revokeObjectURL(url)
993
+ }
994
+ },
995
+ mounted () {
996
+ this.handleClickSketchpad()
997
+ }
998
+ }
999
+ </script>
1000
+
1001
+ <style lang="css" rel="stylesheet/scss">
1002
+ </style>