Browse Source

Merge remote-tracking branch 'remotes/origin/master'

master
xuhuihui 3 years ago
parent
commit
76d4938700
  1. 6
      04.系统编码/Backend/pom.xml
  2. 3
      04.系统编码/Backend/src/main/java/com/userinformation/backend/controller/QualityCompareController.java
  3. 142
      04.系统编码/Backend/src/main/java/com/userinformation/backend/service/QualityCompareService.java
  4. 4
      04.系统编码/Backend/src/main/resources/application.yml
  5. 6
      04.系统编码/Backend/部署.md
  6. 137
      04.系统编码/Frontend/src/components/RamanLidar.vue
  7. 4
      04.系统编码/Frontend/src/model/heat-map-drawer.ts

6
04.系统编码/Backend/pom.xml

@ -101,6 +101,12 @@
<artifactId>bcprov-jdk15on</artifactId>
<version>1.59</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>

3
04.系统编码/Backend/src/main/java/com/userinformation/backend/controller/QualityCompareController.java

@ -22,8 +22,7 @@ public class QualityCompareController {
}
@RequestMapping("findByTimeAndElement")
public RequestResult findByTimeAndElement(String date, String var, String locate) throws IOException {
date = "5_1_10";
public RequestResult findByTimeAndElement(String date, String var, String locate) throws IOException, IllegalAccessException {
return RequestResult.success(qualityCompareService.findByTimeAndElement(date, var, locate));
}
}

142
04.系统编码/Backend/src/main/java/com/userinformation/backend/service/QualityCompareService.java

@ -8,6 +8,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@ -22,21 +23,122 @@ import java.util.stream.Collectors;
@Service
public class QualityCompareService {
private static final String EXTINCTION = "MEXT";
private static final String SEPARATOR = ",";
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy_M_d_HH");
private static final DateTimeFormatter NORMAL_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
private static List<Float[]> ONE_HOUR_INVALID_101 = new ArrayList<>(12);
private static List<Float[]> ONE_HOUR_INVALID_801 = new ArrayList<>(12);
static {
for(int i = 0; i < 12; i++) {
Float[] _101 = new Float[101];
Float[] _801 = new Float[801];
Arrays.fill(_101, Float.NaN);
Arrays.fill(_801, Float.NaN);
ONE_HOUR_INVALID_101.add(_101);
ONE_HOUR_INVALID_801.add(_801);
}
}
@Value("${custom.quality-path}")
private String qualityPath;
public List<Float[]> findByTimeAndElement(String date, String var, String locate) throws IOException {
// String filepath = qualityPath + var + "-" + date + ".CSV";
String filepath = "C:\\Users\\xiaowuler\\Desktop\\原始产品数据\\MEXT-2021-05-01.CSV";
LocalDateTime time = LocalDateTime.parse("2021_" + date, DATE_FORMATTER).withHour(0).plusDays(1);
return read(filepath, time);
public List<Float[]> findByTimeAndElement(String date, String var, String locate) throws IOException, IllegalAccessException {
//// String filepath = qualityPath + var + "-" + date + ".CSV";
// boolean isExtinction = var.equals(EXTINCTION);
// String filepath = String.format("%s/%s/%s/%s-%s.CSV", qualityPath, getFilepathByLocate(locate), isExtinction ? var : "Raman Products/" + var, var, time.format(TIME_FORMATTER));
//// return read(filepath, time, isExtinction? 801 : 101);
//// List<Float[]> data = read(var, locate, time, isExtinction? 801 : 101);
int timeLength = 24;
LocalDateTime time = LocalDateTime.parse(date, DATE_FORMATTER).withMinute(59).withSecond(59);
LocalDateTime tempTime = time;
List<Float[]> data = new ArrayList<>(288);
int readCount = 101;
String fileSuffix = "Raman Products/" + var;
List<Float[]> invalid = ONE_HOUR_INVALID_101;
if (var.equals(EXTINCTION)){
tempTime = time;
timeLength = 12;
readCount = 801;
fileSuffix = var;
invalid = ONE_HOUR_INVALID_801;
}
LocalDateTime startTime = time.minusHours(timeLength);
data = read(var, locate, tempTime, startTime, data, readCount, fileSuffix, invalid, 0, timeLength);
Collections.reverse(data);
AtomicInteger index = new AtomicInteger(0);
// 匹配老师处理的数据
return data.stream().filter(values -> index.getAndIncrement() % 12 != 0).collect(Collectors.toList());
}
private List<Float[]> read(String filepath, LocalDateTime time) throws IOException {
private List<Float[]> read(String var, String locate, LocalDateTime tempTime, LocalDateTime startTime, List<Float[]> data, int readCount, String fileSuffix, List<Float[]> invalid, int currentLength, int timeLength) throws IOException, IllegalAccessException {
String filepath = String.format("%s/%s/%s/%s-%s.CSV", qualityPath, getFilepathByLocate(locate), fileSuffix, var, tempTime.format(TIME_FORMATTER));
if (Files.notExists(Paths.get(filepath))) {
return addInvalidOrBlackFile(var, locate, tempTime, startTime, data, readCount, fileSuffix, invalid, data.size() / 12, timeLength);
}
List<String> lines = Files.readAllLines(Paths.get(filepath));
// 将文件数据进行反转,从最后一行开始读取
Collections.reverse(lines);
int addCount = 0;
for(String line : lines){
List<String> rows = Arrays.asList(line.split(SEPARATOR));
// 相关数据时间转换,以比较,并按照10分钟间隔过滤
LocalDateTime targetTime = LocalDateTime.parse(rows.get(0), NORMAL_TIME_FORMATTER);
if (targetTime.isAfter(tempTime)) {
continue;
}
addCount++;
tempTime = fillNaN(tempTime, targetTime, data, readCount);
data.add(getValues(rows, readCount));
tempTime = tempTime.minusMinutes(5);
if (tempTime.isBefore(startTime)) {
return data;
}
}
// 文件是空的
if (addCount == 0) {
return addInvalidOrBlackFile(var, locate, tempTime, startTime, data, readCount, fileSuffix, invalid, data.size() / 12, timeLength);
}
return read(var, locate, tempTime, startTime, data, readCount, fileSuffix, invalid, data.size() / 12, timeLength);
}
private List<Float[]> addInvalidOrBlackFile(String var, String locate, LocalDateTime tempTime, LocalDateTime startTime, List<Float[]> data, int readCount, String fileSuffix, List<Float[]> invalid, int currentLength, int timeLength) throws IOException, IllegalAccessException {
int hours = tempTime.getHour() + 1 - currentLength;
boolean isOut = hours > timeLength || hours <= 0;
for(int i = 0, len = isOut ? timeLength - currentLength : hours; i < len; i++) {
data.addAll(invalid);
}
if (isOut) {
return data;
}
tempTime = tempTime.minusDays(1).withHour(23);
return read(var, locate, tempTime, startTime, data, readCount, fileSuffix, invalid, data.size() / 12, timeLength);
}
private String getFilepathByLocate(String locate) throws IllegalAccessException {
switch (locate){
case "pk":
return "CloudOutPut2_PUKOU/R1W4201224002";
case "liuhe":
return "CloudOutPut1_LIUHE/R1W4201224001";
case "jn":
return "CloudOutPut_JIANGNING/R1W4210113003";
default:
throw new IllegalAccessException("未知的站点:" + locate);
}
}
private List<Float[]> read(String filepath, LocalDateTime time, int readCount) throws IOException {
List<String> lines = Files.readAllLines(Paths.get(filepath));
// 将文件数据进行反转,从最后一行开始读取
Collections.reverse(lines);
@ -50,8 +152,8 @@ public class QualityCompareService {
continue;
}
time = fillNaN(time, targetTime, data);
data.add(getValues(rows));
time = fillNaN(time, targetTime, data, readCount);
data.add(getValues(rows, readCount));
time = time.minusMinutes(5);
}
@ -61,24 +163,22 @@ public class QualityCompareService {
return data.stream().filter(values -> index.getAndIncrement() % 12 != 0).collect(Collectors.toList());
}
private LocalDateTime fillNaN(LocalDateTime time, LocalDateTime targetTime, List<Float[]> data){
private LocalDateTime fillNaN(LocalDateTime time, LocalDateTime targetTime, List<Float[]> data, int readCount){
if (Duration.between(targetTime, time).toMinutes() > 5) {
Float[] values = new Float[801];
Float[] values = new Float[readCount];
Arrays.fill(values, Float.NaN);
data.add(values);
time = time.minusMinutes(10);
fillNaN(time, targetTime, data);
fillNaN(time, targetTime, data, readCount);
}
return time;
}
private Float[] getValues(List<String> rows){
Float[] values = rows.stream().skip(7).limit(801).map(row -> Float.parseFloat(row)).toArray(Float[]::new);
int length = values.length;
if (length != 801) {
values = Arrays.copyOf(values, 801);
Arrays.fill(values, length - 1, 800, Float.NaN);
}
return values;
private Float[] getValues(List<String> rows, int readCount){
Float[] values = rows.stream().skip(7).limit(readCount - 6).map(row -> Float.parseFloat(row)).toArray(Float[]::new);
Float[] targetValues = new Float[readCount];
Arrays.fill(targetValues, Float.NaN);
System.arraycopy(values, 0, targetValues, 6, values.length);
return targetValues;
}
}

4
04.系统编码/Backend/src/main/resources/application.yml

@ -22,9 +22,9 @@ custom:
gifPath: ${custom.image.path}/gif
path: D:/Deployments/LamanRadar/product
parent-url: http://localhost
quality-path: C:/Users/xiaowuler/Desktop/原始产品数据
quality-path: E:/Memorandum/VPN配置/南京/多曼雷达项目/AllData
# path: /home/project/NJEnvironmentPlatform/html/product
# parent-url: http://10.124.102.10
# quality-path: C:/Users/xiaowuler/Desktop/原始产品数据
# quality-path: /share/win
# path: /home/develop/product
# parent-url: http://rdp.nagr.com.cn

6
04.系统编码/Backend/部署.md

@ -14,3 +14,9 @@ ps -ef | grep UserInformation-0.0.1-SNAPSHOT.jar
kill -9 id
```
挂载
```
mount -t cifs -o username=administrator,password=xxzx_211@LMJGLD //10.124.102.250/AllData /share/win
```

137
04.系统编码/Frontend/src/components/RamanLidar.vue

@ -51,7 +51,7 @@
</div>
<div class="container panel">
<div class="toolbar day-toolbar" v-if="currentElement === 'singleWatervapor' || currentElement === 'aod-icot-wcot'
<div class="toolbar day-toolbar" v-if="currentElement === 'extinction' || currentElement === 'singleWatervapor' || currentElement === 'aod-icot-wcot'
|| currentElement === 'extinctionOptics' || currentElement === 'backscatter'
|| currentElement === 'pm2_5' || currentElement === 'pblh'
|| currentElement === 'cloudSol' || currentElement === 'cloudbaseheight'
@ -72,7 +72,7 @@
</div>
</div>
<div class="toolbar day-toolbar" v-if="currentElement === 'extinction' || currentElement=== 'lidarratio' || currentElement === 'watervapor'">
<div class="toolbar day-toolbar" v-if="currentElement=== 'lidarratio' || currentElement === 'watervapor'">
<div class="times">
<div class="time-item" v-for="(time, index) in times" :key="index"
:class="{'active': currentTime === time.date, 'first-hour': time.day === '01'}">
@ -224,7 +224,7 @@
<div class="picture-container raman-picture-container" v-show="currentElement === 'extinction'">
<div class="picture special-picture">
<div v-loading="loadingExtinctionStatus"
<div v-loading="loadingExtinctionBeforeStatus"
style="width: 100%;"
custom-class="loading"
element-loading-text="加载中">
@ -243,7 +243,7 @@
<div class="picture-container raman-picture-container" v-show="currentElement === 'watervapor'">
<div class="picture special-picture">
<div v-loading="loadingWaterVaporStatus"
<div v-loading="loadingWatervaporBeforeStatus"
style="width: 100%"
element-loading-text="加载中">
<canvas id='watervapor_chart-before'></canvas>
@ -280,6 +280,9 @@ export default {
name: 'RamanLidar',
setup() {
let timer = null;
const quailtyTimes = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13",
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23"];
let creates: {
boundaryLayerHeight: HighChartCreate
cloudsHeight: HighChartCreate
@ -290,6 +293,7 @@ export default {
extinctionBeforeDrawer: HeatMapDrawer,
extinctionDrawer: HeatMapDrawer,
watervaporDrawer: HeatMapDrawer,
watervaporBeforeDrawer: HeatMapDrawer,
opticsExtinctionDrawer: HeatMapDrawer,
singleWatervaporDrawer: HeatMapDrawer,
cloudSolDrawer: HeatMapDrawer,
@ -306,6 +310,7 @@ export default {
extinctionDrawer: null,
extinctionBeforeDrawer: null,
watervaporDrawer: null,
watervaporBeforeDrawer: null,
singleWatervaporDrawer: null,
opticsExtinctionDrawer: null,
cloudSolDrawer: null,
@ -319,7 +324,7 @@ export default {
// currentElement: 'PBLH',
currentType: '边界层高度',
// date: moment('2022-04-01 12:00:00').format('YYYY-MM-DD HH:mm:ss'),
date: moment().format('YYYY-MM-DD HH:mm:ss'),
date: moment().format('YYYY-MM-DD 00:00:00'),
times: [],
currentTime: null,
downloadImgUrl: '/images/default-picture.png',
@ -342,6 +347,8 @@ export default {
loadingCloudSolStatus: false,
loadingCloudRecognitionStatus: false,
loadingExtinctionStatus: false,
loadingExtinctionBeforeStatus: false,
loadingWatervaporBeforeStatus: false,
loadingWaterVaporStatus: false,
loadingBackscatterStatus: false,
loadingLidarRatioStatus: false,
@ -367,13 +374,11 @@ export default {
label: '水汽'
}],
currentElement: 'layertype',
timeLineFormat: 'hour'
timeLineFormat: 'day'
})
onMounted(() => {
// initTimeLine();
initTimeLineDay();
// setTitle(moment(options.date, 'YYYY-MM-DD'));
initTimeLine(true);
setTimeout(() => {
initEcharts(options.currentTab)
reloadChangeData();
@ -446,19 +451,23 @@ export default {
}
const onTabClick = (name) => {
changeTimeLineFormat(name);
setAndChangeCurrentTime(name);
options.currentTab = name;
initEcharts(name)
reloadChangeData()
}
const changeTimeLineFormat = (name) => {
if (name === 'MWR'){
initTimeLineDay();
return;
const setAndChangeCurrentTime = (name) => {
options.index = 23;
if ("MWR" === name){
options.date = moment().format('YYYY-MM-DD 00:00:00');
options.timeLineFormat = "";
}else{
options.date = moment().format('YYYY-MM-DD HH:00:00');
options.timeLineFormat = "";
}
initTimeLine();
options.currentTime = options.date;
}
const reloadChangeData = () => {
@ -540,21 +549,21 @@ export default {
const elementChange = (code: string) => {
switch (code) {
case 'singleWatervapor' :
// initTimeLine()
initTimeLine()
reloadCloudRecognition('singleWatervapor', 101, 'watervapor', drawSingleWatervapor);
break;
case 'aod-icot-wcot' :
// initTimeLine()
initTimeLine()
reloadChartsRecognition('aod', drawAerosolCharts);
reloadChartsRecognition('icot', drawIceCloudsCharts);
reloadChartsRecognition('wcot', drawWaterCloud);
break;
case 'extinctionOptics' :
// initTimeLine()
initTimeLine()
reloadCloudRecognition('extinctionOptics', 801, 'extinction', drawOpticsExtinction);
break;
case 'backscatter' :
// initTimeLine()
initTimeLine()
reloadCloudRecognition('backscatter', 801, 'backscatter', drawBackscatter);
break;
case 'pm2_5' :
@ -575,11 +584,11 @@ export default {
reloadCloudRecognition('cloudSol', 801, 'layertype', drawCloudSol);
break;
case 'cloudbaseheight' :
// initTimeLine()
initTimeLine()
reloadChartsRecognition('cloudbaseheight', drawCloudsHeightCharts);
break;
case 'cloudtopheight' :
// initTimeLine()
initTimeLine()
reloadChartsRecognition('cloudtopheight', drawCloudTopHeightCharts);
break;
// case 'layertype' :
@ -587,33 +596,66 @@ export default {
// break;
case 'extinction' :
// initTimeLineDay()
initTimeLine(true);
reloadExtinctionBefore();
reloadCloudRecognition('extinction', 801, 'extinction', drawExtinctionAfter);
reloadCloudRecognition('extinction', 801, 'extinction', drawExtinctionAfter, false, 12);
break;
case 'watervapor' :
// initTimeLineDay()
reloadCloudRecognition('watervapor', 101, 'watervapor', drawWatervaporBefore);
reloadCloudRecognition('watervapor', 101, 'watervapor', drawWatervaporAfter);
initTimeLineDay()
reloadWatervaporBefore();
reloadCloudRecognition('watervapor', 101, 'watervapor', drawWatervaporAfter, true);
break;
default:
throw new Error("无效的type类型");
}
}
const reloadWatervaporBefore = () => {
options.loadingWatervaporBeforeStatus = true;
let params = {
date: moment(options.date).format('YYYY-MM-DD 00'),
var: 'Vapor Mixing Ratio',
locate: options.currentRegion
}
post("/qualityCompare/findByTimeAndElement", params).then((response: any) => {
options.loadingWatervaporBeforeStatus = false;
if (response.error != 0){
console.log("未找到质控前数据文件");
return;
}
if (creates.watervaporBeforeDrawer != null) {
creates.watervaporBeforeDrawer.close();
}
let matrix = convertValueToBox(response.data);
creates.watervaporBeforeDrawer = new HeatMapDrawer(800, 650, matrix, "watervapor_chart-before", 'g/kg','质控前');
creates.watervaporBeforeDrawer.setAxis(new CoordinateScale(quailtyTimes), new CoordinateScale([0, 500, 1000, 1500], true, true));
creates.watervaporBeforeDrawer.setColorChart(prepareWatervaporColors());
creates.watervaporBeforeDrawer.draw();
})
}
const reloadExtinctionBefore = () => {
options.loadingExtinctionBeforeStatus = true;
let params = {
date: moment(options.date).format('YYYY-MM-DD'),
date: moment(options.date).format('YYYY-MM-DD HH'),
var: 'MEXT',
locate: options.currentRegion
}
post("/qualityCompare/findByTimeAndElement", params).then((response: any) => {
options.loadingExtinctionBeforeStatus = false;
if (response.error != 0){
console.log("未找到质控前数据文件");
return;
}
if (creates.extinctionBeforeDrawer != null) {
creates.extinctionBeforeDrawer.close();
}
let matrix = convertValueToBox(response.data);
creates.extinctionBeforeDrawer = new HeatMapDrawer(800, 650, matrix, "extinction_chart-before", 'km/sr','质控后');
creates.extinctionBeforeDrawer = new HeatMapDrawer(800, 650, matrix, "extinction_chart-before", 'km/sr','质控');
creates.extinctionBeforeDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 2000, 4000, 6000, 8000, 10000, 12000], true, true));
creates.extinctionBeforeDrawer.setColorChart(prepareExtinctionnColors());
creates.extinctionBeforeDrawer.draw();
@ -621,7 +663,12 @@ export default {
}
const convertValueToBox = (data) => {
let timeMoment = moment(options.date).add(-1, 'd');
let timeMoment = moment(options.date).set('h', 1).add(-1, 'd');
console.log(options.currentElement)
if (options.currentElement === 'extinction'){
timeMoment.add(12, 'h');
}
let timeFormat = timeMoment.format("MM月DD日HH时");
let boxes = new Array<Array<Box>>();
@ -634,7 +681,7 @@ export default {
let rows = new Array<Box>(r.length);
for (let h = 0, len = r.length; h < len; h++) {
rows[h] = new Box(index - 1, h, 0, 0, r[h], h * 15, timeFormat, "米");
rows[h] = new Box(index - 1, h, 0, 0, parseFloat(r[h]), h * 15, timeFormat, "米");
}
index++;
boxes.push(rows);
@ -918,21 +965,6 @@ export default {
creates.singleWatervaporDrawer.draw();
}
const drawWatervaporBefore = (result: CustomeArray<any>) => {
if (result.length != 24) return;
options.loadingWaterVaporStatus = false;
if (creates.watervaporDrawer != null) {
creates.watervaporDrawer.close();
}
let matrix = converCloudRecognition(101, result, 'watervapor');
creates.watervaporDrawer = new HeatMapDrawer(800, 650, matrix, "watervapor_chart-before",'g/kg', '质控前');
creates.watervaporDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 500, 1000, 1500], true, true));
creates.watervaporDrawer.setColorChart(prepareWatervaporColors());
creates.watervaporDrawer.draw();
}
const drawWatervaporAfter = (result: CustomeArray<any>) => {
if (result.length != 24) return;
@ -942,8 +974,8 @@ export default {
}
let matrix = converCloudRecognition(101, result, 'watervapor');
creates.watervaporDrawer = new HeatMapDrawer(800, 650, matrix, "watervapor_chart-after",'g/kg', '质控');
creates.watervaporDrawer.setAxis(new CoordinateScale(options.timeArray), new CoordinateScale([0, 500, 1000, 1500], true, true));
creates.watervaporDrawer = new HeatMapDrawer(800, 650, matrix, "watervapor_chart-after",'g/kg', '质控');
creates.watervaporDrawer.setAxis(new CoordinateScale(quailtyTimes), new CoordinateScale([0, 500, 1000, 1500], true, true));
creates.watervaporDrawer.setColorChart(prepareWatervaporColors());
creates.watervaporDrawer.draw();
}
@ -956,7 +988,7 @@ export default {
}
const drawExtinctionAfter = (result: CustomeArray<any>) => {
if (result.length != 24) return;
if (result.length != 12) return;
options.loadingExtinctionStatus = false;
if (creates.extinctionDrawer != null) {
@ -979,12 +1011,14 @@ export default {
return colorChart;
}
const reloadCloudRecognition = (type: string, capacity: number, element: string, callback: any) => {
const reloadCloudRecognition = (type: string, capacity: number, element: string, callback: any, isDay: boolean = false, length = 24) => {
preprocessing(type);
let result = new CustomeArray(callback);
let time = moment(options.date);
if (isDay) time.set('h', 23).add(-1, 'd');
options.timeArray = []
for (let index = 0; index < 24; index++) {
for (let index = 0; index < length; index++) {
reloadSingleCloudRecognition(capacity, time.clone().add(-index, 'h').format('M_D_H'), element, result);
options.timeArray.push(time.clone().add(-index, 'h').format('HH'))
}
@ -1265,12 +1299,13 @@ export default {
// }
//
const initTimeLine = () => {
const initTimeLine = (isQuality: boolean = false) => {
if (options.timeLineFormat == "hour") return;
options.timeLineFormat = "hour";
options.times = [];
options.currentTime = moment(options.date).format('YYYY-MM-DD HH');
let now = moment(options.date).add(1, 'h')
let now = moment(options.date).add(1, 'h');
if (isQuality) now = now.set('h', 1);
for (let i = 0; i < 24; i++) {
options.times.push({
hour: now.add(-1, 'hour').format('HH'),

4
04.系统编码/Frontend/src/model/heat-map-drawer.ts

@ -381,11 +381,11 @@ export class HeatMapDrawer{
export class CoordinateScale {
public scales: Array<number>;
public scales: Array<Object>;
public showStartValue: boolean;
public showEndValue: boolean;
constructor(scales: Array<number>, showStartValue: boolean = false, showEndValue: boolean = false){
constructor(scales: Array<Object>, showStartValue: boolean = false, showEndValue: boolean = false){
this.scales = scales;
this.showEndValue = showEndValue;
this.showStartValue = showStartValue;

Loading…
Cancel
Save