radar.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. <template>
  2. <div style="height: 100%">
  3. <el-row style="height: 67%" :gutter="10">
  4. <el-col :span="7" style="height: 100%">
  5. <el-card class="tableHeight">
  6. <div slot="header" class="clearfix">
  7. <span>雷达控制参数</span>
  8. <el-button size="mini" type="success" @click="handleEdit" style="float: right">变更</el-button>
  9. </div>
  10. <el-table :data="radarParams" style="width: 100%" size="small" border fit>
  11. <!-- @current-change="instanceChange" -->
  12. <el-table-column width="130" prop="key" label="属性"></el-table-column>
  13. <el-table-column width="80" prop="value" label="值"></el-table-column>
  14. <el-table-column label="操作">
  15. <template slot-scope="scope">
  16. <el-switch v-if="scope.row.key == '开关机状态'" active-text="打开" inactive-text="关闭"
  17. v-model="StartUpStatusBoolean" :change="switchChange()"></el-switch>
  18. <el-select v-if="scope.row.key == '抗干扰措施'" v-model="currentRadarParam.AntiJamStyle" size="mini"
  19. placeholder="请选择防干扰措施">
  20. <el-option v-for="item in AntiJamStyles" :key="item.value" :label="item.label" :value="item.value">
  21. </el-option>
  22. </el-select>
  23. <el-button v-if="scope.row.key == '脉冲参数'" type="primary" size="mini">编辑</el-button>
  24. <el-select v-if="scope.row.key == '工作模式'" v-model="currentRadarParam.RadarWorkType" size="mini"
  25. placeholder="请选择工作模式">
  26. <el-option v-for="item in radarModes" :key="item.value" :label="item.label" :value="item.value">
  27. </el-option>
  28. </el-select>
  29. <el-slider v-if="scope.row.key == '方位扫描中心(°)'" v-model="currentRadarParam.AzimuthScanCenter" :step="5"
  30. :min="-180" :max="179" input-size="mini"> </el-slider>
  31. <el-slider v-if="scope.row.key == '俯仰扫描中心(°)'" v-model="currentRadarParam.PitchScanCenter" :step="5"
  32. :min="-90" :max="89" input-size="mini"> </el-slider>
  33. <el-slider v-if="scope.row.key == '方位扫描范围(°)'" v-model="currentRadarParam.AzimuthScanDeg" :step="5"
  34. :min="0" :max="50" input-size="mini"> </el-slider>
  35. <el-slider v-if="scope.row.key == '俯仰扫描范围(°)'" v-model="currentRadarParam.PitchScanDeg" :step="5"
  36. :min="0" :max="50" input-size="mini"> </el-slider>
  37. <el-input-number v-if="scope.row.key == '天线最大增益(dB)'" :step="1" :max="120" :min="-120"
  38. v-model="currentRadarParam.MaxGain" size="mini"></el-input-number>
  39. <el-input-number v-if="scope.row.key == '发射机功率(W)'" :step="10" :max="100" :min="50"
  40. v-model="currentRadarParam.PeakPower" size="mini"></el-input-number>
  41. <el-input-number v-if="scope.row.key == '方位波束宽度'" :step="1" :max="10" :min="0"
  42. v-model="currentRadarParam.BeamAzimuthWidth" size="mini"></el-input-number>
  43. <el-input-number v-if="scope.row.key == '俯仰波束宽度'" :step="1" :max="10" :min="0"
  44. v-model="currentRadarParam.BeamPitchWidth" size="mini"></el-input-number>
  45. </template>
  46. </el-table-column>
  47. </el-table>
  48. </el-card>
  49. </el-col>
  50. <el-col :span="12" style="height: 100%">
  51. <el-card class="radar">
  52. <div slot="header" class="clearfix">
  53. <span>半实物设备状态</span>
  54. </div>
  55. <el-table height="100%" border size="small" :data="sdrStatus">
  56. <el-table-column prop="key" align="left" label="属性" width="130"></el-table-column>
  57. <el-table-column prop="value" align="right" label="值"></el-table-column>
  58. </el-table>
  59. </el-card>
  60. </el-col>
  61. <el-col :span="5" style="height: 100%">
  62. <el-card class="tableHeight">
  63. <div slot="header" class="clearfix">
  64. <span>雷达状态</span>
  65. </div>
  66. <el-table :data="radarStatusList" style="width: 100%">
  67. <el-table-column prop="key" label="参数"></el-table-column>
  68. <el-table-column prop="value" label="数值">
  69. <template slot-scope="scope">
  70. <span>{{ scope.row.value }}</span>
  71. </template>
  72. </el-table-column>
  73. </el-table>
  74. </el-card>
  75. </el-col>
  76. </el-row>
  77. <el-row style="height: 33%">
  78. <el-card class="target">
  79. <div slot="header" class="clearfix">
  80. <span>雷达目标列表</span>
  81. </div>
  82. <el-table :data="radarData" class="targetTable" height="100%;" size="small" border fit ref="radarTargetTable">
  83. <el-table-column prop="SimTime" label="时间"></el-table-column>
  84. <el-table-column prop="TargetID" label="目标批号"> </el-table-column>
  85. <el-table-column prop="EnemyPro" label="敌我属性"> </el-table-column>
  86. <el-table-column prop="FlightState" label="航迹状态">
  87. </el-table-column>
  88. <el-table-column prop="LightQuality" label="航迹质量">
  89. </el-table-column>
  90. <el-table-column prop="TargetAzi" label="目标方位角(°)">
  91. </el-table-column>
  92. <el-table-column prop="TargetEle" label="目标俯仰角(°)">
  93. </el-table-column>
  94. <el-table-column prop="TargetDistance" label="目标距离(m)">
  95. </el-table-column>
  96. <el-table-column prop="TargetRSpeed" label="目标径向速度(m/s)">
  97. </el-table-column>
  98. </el-table>
  99. </el-card>
  100. </el-row>
  101. </div>
  102. </template>
  103. <script>
  104. import { mapGetters } from "vuex";
  105. import axios from "axios";
  106. export default {
  107. computed: {
  108. ...mapGetters('app', [
  109. "init",
  110. "radarParams",
  111. "radarStatus",
  112. "radarData",
  113. "platformID",
  114. ]),
  115. radarStatusList() {
  116. return this.radarStatus || [];
  117. }
  118. },
  119. watch: {
  120. init: {
  121. handler: function (val, oldVal) { },
  122. },
  123. platformID: {
  124. handler: function (val, oldVal) {
  125. // this.$wst.send({
  126. // url: "getRadarInstances",
  127. // data: {
  128. // PlatformID: this.platformID,
  129. // },
  130. // });
  131. },
  132. },
  133. radarParams: {
  134. handler: function (val, oldVal) {
  135. if (this.getValue(val, "开关机状态") == "开机") {
  136. this.currentRadarParam.StartUpStatus = 1;
  137. } else {
  138. this.currentRadarParam.StartUpStatus = 0;
  139. }
  140. if (this.getValue(val, "抗干扰措施") == "不抗干扰") {
  141. this.currentRadarParam.AntiJamStyle = 0;
  142. } else if (this.getValue(val, "抗干扰措施") == "频率捷变") {
  143. this.currentRadarParam.AntiJamStyle = 1;
  144. } else if (this.getValue(val, "抗干扰措施") == "旁瓣匿影") {
  145. this.currentRadarParam.AntiJamStyle = 2;
  146. } else if (this.getValue(val, "抗干扰措施") == "旁瓣对消") {
  147. this.currentRadarParam.AntiJamStyle = 3;
  148. }
  149. if (this.getValue(val, "工作模式") == "待机") {
  150. this.currentRadarParam.RadarWorkType = 0;
  151. } else if (this.getValue(val, "工作模式") == "搜索") {
  152. this.currentRadarParam.RadarWorkType = 1;
  153. } else if (this.getValue(val, "工作模式") == "跟踪") {
  154. this.currentRadarParam.RadarWorkType = 2;
  155. }
  156. this.currentRadarParam.AzimuthScanCenter = this.getValue(val, "方位扫描中心(°)");;
  157. this.currentRadarParam.PitchScanCenter = this.getValue(val, "俯仰扫描中心(°)");;
  158. this.currentRadarParam.AzimuthScanDeg = this.getValue(val, "方位扫描范围(°)");;
  159. this.currentRadarParam.PitchScanDeg = this.getValue(val, "俯仰扫描范围(°)");;
  160. this.currentRadarParam.Detection = this.getValue(val, "发现概率");
  161. this.currentRadarParam.WorkFreq = this.getValue(val, "雷达工作频率");
  162. this.currentRadarParam.MaxGain = this.getValue(val, "最大增益");
  163. this.currentRadarParam.PeakPower = this.getValue(val, "发射机峰值功率");
  164. this.currentRadarParam.FalseAlarm = this.getValue(val, "虚警率");
  165. this.currentRadarParam.PulseFreq = this.getValue(val, "脉冲重复频率");
  166. this.currentRadarParam.AntennaSpeed = this.getValue(val, "天线转速");
  167. this.currentRadarParam.BeamAzimuthWidth = this.getValue(
  168. val,
  169. "方位波束宽度"
  170. );
  171. this.currentRadarParam.BeamPitchWidth = this.getValue(
  172. val,
  173. "俯仰波束宽度"
  174. );
  175. this.currentRadarParam.PulseWidth = this.getValue(val, "脉冲宽度");
  176. this.currentRadarParam.SignalWidth = this.getValue(val, "信号带宽");
  177. this.currentRadarParam.SideGain = this.getValue(val, "副瓣增益");
  178. this.StartUpStatusBoolean =
  179. this.currentRadarParam.StartUpStatus == 1 ? true : false;
  180. },
  181. },
  182. },
  183. data() {
  184. return {
  185. data: [[859, 10],
  186. [458, 40],
  187. [269, 120],
  188. [234, 210]],
  189. frequencevalue: "",
  190. workvalue: "",
  191. radarEchart: null,
  192. uRrWorkModeBoolean: true,
  193. StartUpStatusBoolean: null,
  194. currentRadarParam: {
  195. StartUpStatus: null,
  196. AntiJamStyle: null,
  197. RadarWorkType: null,
  198. AzimuthScanCenter: null,
  199. PitchScanCenter: null,
  200. AzimuthScanDeg: null,
  201. PitchScanDeg: null,
  202. Detection: null,
  203. WorkFreq: null,
  204. MaxGain: null,
  205. PeakPower: null,
  206. FalseAlarm: null,
  207. PulseFreq: null,
  208. AntennaSpeed: null,
  209. BeamAzimuthWidth: null,
  210. BeamPitchWidth: null,
  211. PulseWidth: null,
  212. SignalWidth: null,
  213. SideGain: null,
  214. },
  215. sdrStatus: [
  216. { key: "平台状态", value: "未知" },
  217. { key: "服务状态", value: "未知" },
  218. { key: "干扰策略", value: "未知" },
  219. { key: "抗干扰策略", value: "未知" },
  220. ],
  221. AntiJamStyles: [
  222. {
  223. value: 0,
  224. label: "不抗干扰",
  225. },
  226. {
  227. value: 1,
  228. label: "频率捷变",
  229. },
  230. {
  231. value: 2,
  232. label: "旁瓣匿影",
  233. },
  234. {
  235. value: 3,
  236. label: "旁瓣对消",
  237. },
  238. ],
  239. radarModes: [
  240. {
  241. value: 0,
  242. label: "待机",
  243. },
  244. {
  245. value: 1,
  246. label: "搜索",
  247. },
  248. {
  249. value: 2,
  250. label: "跟踪",
  251. },
  252. ],
  253. echartoption: {
  254. polar: {},
  255. tooltip: {
  256. trigger: "axis",
  257. axisPointer: {
  258. type: "cross",
  259. },
  260. },
  261. angleAxis: {
  262. max: 360,
  263. min: 0,
  264. type: "value",
  265. startAngle: 90,
  266. },
  267. radiusAxis: {
  268. max: 1000,
  269. min: 0,
  270. splitArea: {
  271. show: true,
  272. areaStyle: {
  273. color: ["#006600", "#009900", "#00CC00"],
  274. },
  275. },
  276. axisLine: {
  277. lineStyle: {
  278. color: "#f7f7f7", // 设置轴线的颜色为红色
  279. },
  280. },
  281. axisPointer: {
  282. show: false,
  283. },
  284. },
  285. series: [
  286. {
  287. coordinateSystem: "polar",
  288. name: "line",
  289. type: "scatter",
  290. data: null,
  291. },
  292. ],
  293. },
  294. // radarData: {
  295. // [12, 32,42]
  296. // }
  297. timer: null, // 添加timer属性
  298. };
  299. },
  300. activated() {
  301. try {
  302. this.timerRefresh();
  303. this.refreshTargets();
  304. this.setTimer();
  305. } catch (error) {
  306. console.error('激活组件时出错:', error);
  307. }
  308. },
  309. deactivated() {
  310. try {
  311. if (this.timer) {
  312. clearInterval(this.timer);
  313. this.timer = null;
  314. }
  315. } catch (error) {
  316. console.error('停用组件时出错:', error);
  317. }
  318. },
  319. beforeDestroy() {
  320. this.timerDestory();
  321. },
  322. mounted() {
  323. // for (let i = 0; i <= 7; i++) {
  324. // let theta = (i / 100) * 180 + Math.random() * 90;
  325. // let r = 5 * (1 + Math.sin((theta / 180) * Math.PI));
  326. // this.data.push([r, theta]);
  327. // // this.Radarresults.push({
  328. // // az: theta,
  329. // // range: r,
  330. // // });
  331. // }
  332. this.echartoption.series[0].data = this.data;
  333. this.echartsInit();
  334. // 页面加载设置高度自适应
  335. window.onresize = () => {
  336. this.resizeDom();
  337. };
  338. // 页面加载设置高度自适应
  339. this.resizeDom();
  340. },
  341. methods: {
  342. setTimer() {
  343. try {
  344. if (this.timer == null) {
  345. this.timer = setInterval(() => {
  346. // 刷新雷达状态
  347. this.timerRefresh().catch(error => {
  348. console.error('定时刷新雷达状态出错:', error);
  349. });
  350. // 刷新雷达目标数据
  351. this.refreshTargets().catch(error => {
  352. console.error('定时刷新目标数据出错:', error);
  353. });
  354. }, 3000);
  355. }
  356. } catch (error) {
  357. console.error('设置定时器出错:', error);
  358. }
  359. },
  360. timerDestory() {
  361. if (this.timer) {
  362. clearInterval(this.timer);
  363. this.timer = null;
  364. }
  365. },
  366. async timerRefresh() {
  367. try {
  368. const response = await axios.get(`/api/platform/${this.platformID}/radar-status`);
  369. if (response.data) {
  370. const formattedData = response.data.map(item => ({
  371. ...item,
  372. value: item.value?.toString() || ''
  373. }));
  374. this.$store.commit("app/SET_RADAR_STATUS", formattedData);
  375. }
  376. } catch (error) {
  377. console.error('获取雷达状态失败:', error);
  378. // 网络错误时使用默认值
  379. if (error.code === 'ERR_NETWORK') {
  380. const defaultStatus = [
  381. { key: "型号", value: "相控阵雷达" },
  382. { key: "序号", value: "001" },
  383. { key: "类型", value: "相控阵雷达" },
  384. { key: "连接方式", value: "CAN" },
  385. { key: "开机时间", value: new Date().toLocaleTimeString() },
  386. { key: "发现概率(%)", value: "95.0" },
  387. { key: "虚警率(%)", value: "3.0" },
  388. { key: "扫描周期(s)", value: "1" }
  389. ];
  390. this.$store.commit("app/SET_RADAR_STATUS", defaultStatus);
  391. }
  392. }
  393. axios.get(`http://192.168.5.22:5200/api/platform/${this.platformID}/getSdrStatusByID`)
  394. .then(response => {
  395. console.log(response.data)
  396. console.log(this.sdrStatus)
  397. this.sdrStatus[0].value = response.data.platformStatus
  398. this.sdrStatus[1].value = response.data.serviceStatus
  399. this.sdrStatus[2].value = response.data.jamingPolicy
  400. this.sdrStatus[3].value = response.data.investingPolicy
  401. console.log(this.sdrStatus)
  402. })
  403. },
  404. echartsInit() {
  405. this.$echarts
  406. .init(document.getElementById("radarEchart"))
  407. .setOption(this.echartoption);
  408. if (this.localEchart == null) {
  409. this.radarEchart = this.$echarts.init(
  410. document.getElementById("radarEchart")
  411. );
  412. } else {
  413. this.radarEchart.setOption(this.echartoption);
  414. }
  415. },
  416. echartsRefresh() {
  417. this.data = [];
  418. for (let i = 0; i <= 7; i++) {
  419. let theta = (i / 100) * 180 + Math.random() * 360;
  420. let r = 5 * (1 + Math.sin((theta / 180) * Math.PI));
  421. this.data.push([r, theta]);
  422. // this.ESMresults.push({
  423. // az: theta,
  424. // range: r,
  425. // });
  426. }
  427. this.echartoption.series[0].data = this.data;
  428. this.echartsInit();
  429. },
  430. //通过窗体高宽计算容器高宽,渲染echart图表的div的宽高度以达到自适应目的
  431. resizeDom() {
  432. console.log("高度自适应");
  433. const boxHeight =
  434. document.getElementsByClassName("echarts-box")[0].clientHeight;
  435. var Echart = document.getElementById("radarEchart");
  436. Echart.style.height = boxHeight - 65 + "px";
  437. this.$echarts.init(document.getElementById("radarEchart")).resize();
  438. },
  439. async handleEdit() {
  440. try {
  441. // 添加参数默认值和类型检查
  442. const getParamValue = (value, defaultValue = "0") => {
  443. if (value === null || value === undefined) {
  444. return defaultValue;
  445. }
  446. return value.toString();
  447. };
  448. // 构造符合后端API格式的参数数组
  449. const radarParams = [
  450. {
  451. key: "开关机状态",
  452. value: this.StartUpStatusBoolean ? "打开" : "关闭"
  453. },
  454. {
  455. key: "抗干扰措施",
  456. value: this.getAntiJamStyleText(this.currentRadarParam.AntiJamStyle || 0)
  457. },
  458. {
  459. key: "工作模式",
  460. value: this.getWorkModeText(this.currentRadarParam.RadarWorkType || 0)
  461. },
  462. {
  463. key: "脉冲参数",
  464. value: "自动"
  465. },
  466. {
  467. key: "方位扫描中心(°)",
  468. value: getParamValue(this.currentRadarParam.AzimuthScanCenter, "0")
  469. },
  470. {
  471. key: "俯仰扫描中心(°)",
  472. value: getParamValue(this.currentRadarParam.PitchScanCenter, "0")
  473. },
  474. {
  475. key: "波束宽度(°)",
  476. value: getParamValue(this.currentRadarParam.BeamAzimuthWidth, "2")
  477. },
  478. {
  479. key: "方位扫描范围(°)",
  480. value: getParamValue(this.currentRadarParam.AzimuthScanDeg, "10")
  481. },
  482. {
  483. key: "俯仰扫描范围(°)",
  484. value: getParamValue(this.currentRadarParam.PitchScanDeg, "10")
  485. },
  486. {
  487. key: "发射机功率(W)",
  488. value: getParamValue(this.currentRadarParam.PeakPower, "100")
  489. }
  490. ];
  491. // 检查platformID是否存在
  492. if (!this.platformID) {
  493. throw new Error("平台ID不能为空");
  494. }
  495. // 发送POST请求到后端API
  496. const response = await axios.post(
  497. `/api/platform/${this.platformID}/radar-params`,
  498. radarParams
  499. );
  500. if (response.data) {
  501. // 只更新雷达控制参数
  502. this.$store.commit("app/SET_RADAR_PARAMS", radarParams);
  503. this.$message.success("雷达参数更新成功");
  504. }
  505. } catch (error) {
  506. console.error("更新雷达参数失败:", error);
  507. this.$message.error(error.message || "更新雷达参数失败");
  508. }
  509. },
  510. getAntiJamStyleText(value) {
  511. const styles = {
  512. 0: "不抗干扰",
  513. 1: "频率捷变",
  514. 2: "旁瓣匿影",
  515. 3: "旁瓣对消"
  516. };
  517. return styles[value] || styles[0];
  518. },
  519. getWorkModeText(value) {
  520. const modes = {
  521. 0: "待机",
  522. 1: "搜索",
  523. 2: "跟踪"
  524. };
  525. return modes[value] || modes[0];
  526. },
  527. getValue(params, key) {
  528. let value = null;
  529. params.forEach((element) => {
  530. if (element.key == key) {
  531. value = element.value;
  532. }
  533. });
  534. return value;
  535. },
  536. switchChange() {
  537. this.currentRadarParam.StartUpStatus =
  538. this.StartUpStatusBoolean == true ? 1 : 0;
  539. },
  540. async refreshTargets() {
  541. try {
  542. const response = await axios.get(`/api/platform/${this.platformID}/radar-targets`);
  543. if (response.data) {
  544. // 将后端数据的字段名转换为前端使用的格式
  545. const formattedData = response.data.map(item => ({
  546. SimTime: item.simTime,
  547. TargetID: item.targetId,
  548. EnemyPro: item.enemyPro,
  549. FlightState: item.flightState,
  550. LightQuality: item.lightQuality,
  551. TargetAzi: item.targetAzi,
  552. TargetEle: item.targetEle,
  553. TargetDistance: item.targetDistance,
  554. TargetRSpeed: item.targetRSpeed
  555. }));
  556. // 更新到 store
  557. this.$store.commit("app/SET_RADAR_DATA", formattedData);
  558. // 更新雷达图上的点
  559. this.data = formattedData.map(item => [item.TargetDistance, item.TargetAzi]);
  560. this.echartoption.series[0].data = this.data;
  561. this.echartsInit();
  562. // 添加自动滚动到最新数据
  563. this.$nextTick(() => {
  564. const table = this.$refs.radarTargetTable;
  565. if (table && formattedData.length > 0) {
  566. // 获取表格的滚动容器
  567. const scrollContainer = table.bodyWrapper;
  568. if (scrollContainer) {
  569. scrollContainer.scrollTop = scrollContainer.scrollHeight;
  570. }
  571. }
  572. });
  573. }
  574. } catch (error) {
  575. console.error('获取雷达目标数据失败:', error);
  576. if (error.code === 'ERR_NETWORK') {
  577. // 网络错误时使用默认数据
  578. const defaultData = [
  579. {
  580. SimTime: "14:37.15",
  581. TargetID: 1,
  582. EnemyPro: "我方",
  583. FlightState: "进入搜索范围",
  584. LightQuality: "高",
  585. TargetAzi: 10,
  586. TargetEle: -50,
  587. TargetDistance: 859,
  588. TargetRSpeed: 5.4
  589. }
  590. // ... 可以添加更多默认数据
  591. ];
  592. this.$store.commit("app/SET_RADAR_DATA", defaultData);
  593. }
  594. }
  595. }
  596. },
  597. };
  598. </script>
  599. <style scoped>
  600. ::v-deep .el-input__inner {
  601. background-color: transparent !important;
  602. border: 1px solid #1296db;
  603. color: #ffffff;
  604. }
  605. ::v-deep .el-form-item__label {
  606. color: white !important;
  607. }
  608. .tableHeight {
  609. height: 100%;
  610. }
  611. .echarts-box {
  612. height: 100%;
  613. width: 100%;
  614. }
  615. #radarEchart {
  616. width: 100%;
  617. height: 100% !important;
  618. }
  619. .radar {
  620. height: 100%;
  621. }
  622. </style>