rapid-spreadjs 1.0.101 → 1.0.102

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.
package/dist/index.cjs.js CHANGED
@@ -8633,6 +8633,174 @@ const EChartsUtilsAll = {
8633
8633
  };
8634
8634
  return option;
8635
8635
  },
8636
+ /**
8637
+ * 最大剪应力与法向应力关系曲线
8638
+ * @param config 折线配置
8639
+ * @param xDataArr x轴原始数据(二维数组)
8640
+ * @param yDataArr y轴原始数据(二维数组)
8641
+ * @returns 返回ECharts配置项
8642
+ */
8643
+ chart450: (config, xDataArr, yDataArr, sheet) => {
8644
+ let lineData = JSON.parse(config.chartLinesJson);
8645
+ // const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);
8646
+ let title = config.chartTitle, xName = config.chartXName, yName = config.chartYName, color = lineData[0].lineColor;
8647
+ // 原始数据
8648
+ const xData = xDataArr[0];
8649
+ const yData = yDataArr[0];
8650
+ // 计算线性回归参数(斜率和截距)
8651
+ function linearRegression(x, y) {
8652
+ const n = x.length;
8653
+ let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
8654
+ for (let i = 0; i < n; i++) {
8655
+ sumX += x[i];
8656
+ sumY += y[i];
8657
+ sumXY += x[i] * y[i];
8658
+ sumXX += x[i] * x[i];
8659
+ }
8660
+ const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
8661
+ const intercept = (sumY - slope * sumX) / n;
8662
+ return { slope, intercept };
8663
+ }
8664
+ const regression = linearRegression(xData, yData);
8665
+ // console.log('斜率:', regression.slope, '截距:', regression.intercept);
8666
+ // 计算趋势线的数据点
8667
+ // 前推0.0,后推50.0
8668
+ Math.min(...xData);
8669
+ const maxX = Math.max(...xData) + 50; // 后推50
8670
+ // 生成趋势线数据点,确保与y轴相交(x=0)
8671
+ const trendData = [];
8672
+ for (let x = 0; x <= maxX; x += 10) {
8673
+ const y = regression.slope * x + regression.intercept;
8674
+ trendData.push([x, y]);
8675
+ }
8676
+ let yValIsAllNull = false;
8677
+ if (xData.length == 0 ||
8678
+ yData.length == 0 ||
8679
+ (!xData.some((x) => x != '' && x != '/' && x != null && x != undefined) &&
8680
+ !yData.some((x) => x != '' && x != '/' && x != null && x != undefined))) {
8681
+ yValIsAllNull = true;
8682
+ }
8683
+ if (xData.filter((x) => x == 0).length == xData.length || yData.filter((x) => x == 0).length == yData.length) {
8684
+ yValIsAllNull = true;
8685
+ }
8686
+ // 配置图表选项
8687
+ const option = {
8688
+ title: [
8689
+ {
8690
+ show: true,
8691
+ text: title,
8692
+ left: 'center',
8693
+ top: 2,
8694
+ textStyle: {
8695
+ fontSize: 14,
8696
+ fontWeight: 'normal',
8697
+ },
8698
+ },
8699
+ {
8700
+ show: true,
8701
+ text: xName,
8702
+ left: 'center',
8703
+ bottom: 0,
8704
+ textStyle: {
8705
+ fontSize: 12,
8706
+ fontWeight: 'normal',
8707
+ },
8708
+ },
8709
+ ],
8710
+ grid: {
8711
+ top: 25,
8712
+ left: 25,
8713
+ right: 15,
8714
+ bottom: 20,
8715
+ containLabel: true,
8716
+ },
8717
+ tooltip: {
8718
+ trigger: 'axis',
8719
+ formatter: function (params) {
8720
+ let result = '';
8721
+ params.forEach((param) => {
8722
+ if (param.seriesName === '实际数据') {
8723
+ result += `法向应力: ${param.value[0]} kPA<br/>剪应力: ${param.value[1]} kPA`;
8724
+ }
8725
+ else if (param.seriesName === '趋势线') {
8726
+ result += `趋势线<br/>法向应力: ${param.value[0]} kPA<br/>预测剪应力: ${param.value[1].toFixed(2)} kPA`;
8727
+ }
8728
+ });
8729
+ return result;
8730
+ },
8731
+ },
8732
+ xAxis: {
8733
+ name: xName,
8734
+ nameLocation: 'end',
8735
+ nameGap: 20,
8736
+ nameTextStyle: {
8737
+ fontSize: 12,
8738
+ fontWeight: 'bold',
8739
+ },
8740
+ type: 'value',
8741
+ min: 0,
8742
+ max: 450,
8743
+ interval: 50,
8744
+ axisLine: {
8745
+ lineStyle: {
8746
+ color: '#333',
8747
+ },
8748
+ },
8749
+ },
8750
+ yAxis: {
8751
+ name: yName,
8752
+ nameGap: !yValIsAllNull ? 35 : 5,
8753
+ nameRotate: 90,
8754
+ nameLocation: 'middle',
8755
+ type: 'value',
8756
+ min: 0,
8757
+ interval: 50,
8758
+ axisLine: {
8759
+ lineStyle: {
8760
+ color: '#333',
8761
+ },
8762
+ },
8763
+ },
8764
+ series: [
8765
+ {
8766
+ name: '实际数据',
8767
+ type: 'scatter',
8768
+ data: !yValIsAllNull ? xData.map((x, i) => [x, yData[i]]) : [],
8769
+ symbolSize: 5,
8770
+ itemStyle: {
8771
+ color: color,
8772
+ },
8773
+ },
8774
+ {
8775
+ name: '趋势线',
8776
+ type: 'line',
8777
+ data: !yValIsAllNull ? trendData : [],
8778
+ symbol: 'none',
8779
+ lineStyle: {
8780
+ color: color,
8781
+ width: 1,
8782
+ type: 'solid',
8783
+ },
8784
+ /*
8785
+ markPoint: {
8786
+ data: [
8787
+ {
8788
+ type: 'min',
8789
+ symbol: 'circle',
8790
+ symbolSize: 6,
8791
+ label: {
8792
+ formatter: '起点',
8793
+ position: 'right'
8794
+ }
8795
+ }
8796
+ ]
8797
+ }
8798
+ */
8799
+ },
8800
+ ],
8801
+ };
8802
+ return option;
8803
+ },
8636
8804
  };
8637
8805
 
8638
8806
  /**
@@ -20296,6 +20464,83 @@ const FormulaUtils = {
20296
20464
  return sw;
20297
20465
  },
20298
20466
  },
20467
+ {
20468
+ funName: 'YJWDDLZ',
20469
+ funDesc: '马歇尔稳定度/流值',
20470
+ funDefaultVal: null,
20471
+ isAcceptArea: true,
20472
+ funParams: [
20473
+ {
20474
+ name: '数值1',
20475
+ repeatable: false,
20476
+ optional: false,
20477
+ },
20478
+ {
20479
+ name: '数值2',
20480
+ repeatable: false,
20481
+ optional: false,
20482
+ },
20483
+ {
20484
+ name: '数值3',
20485
+ repeatable: false,
20486
+ optional: false,
20487
+ },
20488
+ {
20489
+ name: '数值4',
20490
+ repeatable: false,
20491
+ optional: false,
20492
+ },
20493
+ {
20494
+ name: '数值5',
20495
+ repeatable: false,
20496
+ optional: false,
20497
+ },
20498
+ {
20499
+ name: '数值6',
20500
+ repeatable: false,
20501
+ optional: false,
20502
+ },
20503
+ {
20504
+ name: '超过比例,如:0.15、0.2',
20505
+ repeatable: false,
20506
+ optional: false,
20507
+ },
20508
+ ],
20509
+ funCallback: (spread, sheet, retData) => {
20510
+ //如果传递的参数小于7个,则返回空字符串
20511
+ if (retData.allCellVals.length < 7) {
20512
+ return '/';
20513
+ }
20514
+ const val1 = retData.allCellVals[0], val2 = retData.allCellVals[1], val3 = retData.allCellVals[2], val4 = retData.allCellVals[3], val5 = retData.allCellVals[4], val6 = retData.allCellVals[5], overVal = retData.allCellVals[6];
20515
+ // 参数类型检查 - 所有参数必须为数字类型
20516
+ const args = [val1, val2, val3, val4, val5, val6, overVal];
20517
+ for (let i = 0; i < args.length; i++) {
20518
+ if (typeof args[i] !== 'number' || isNaN(args[i])) {
20519
+ return '/';
20520
+ }
20521
+ }
20522
+ // 提取前6个值进行计算
20523
+ const values = [val1, val2, val3, val4, val5, val6];
20524
+ // 计算初始平均值avg
20525
+ const sum = values.reduce((acc, val) => rapidUtils.preciseCalc(acc, val, 'add'), 0);
20526
+ const avg = rapidUtils.preciseCalc(sum, values.length, 'div');
20527
+ // 检查是否有值与平均值a的差大于overVal(不取绝对值)
20528
+ const abnormalValues = values.filter((val) => rapidUtils.preciseCalc(val, avg, 'sub') > rapidUtils.preciseCalc(overVal, val, 'mul'));
20529
+ // 如果没有异常值,直接返回平均值a
20530
+ if (abnormalValues.length === 0) {
20531
+ return avg;
20532
+ }
20533
+ // 舍弃异常值后重新计算平均值
20534
+ const normalValues = values.filter((val) => rapidUtils.preciseCalc(val, avg, 'sub') <= rapidUtils.preciseCalc(overVal, val, 'mul'));
20535
+ // 确保至少有一个正常值
20536
+ if (normalValues.length === 0) {
20537
+ return '/';
20538
+ }
20539
+ // 计算剩余值的平均值
20540
+ const newSum = normalValues.reduce((acc, val) => rapidUtils.preciseCalc(acc, val, 'add'), 0);
20541
+ return rapidUtils.preciseCalc(newSum, normalValues.length, 'div');
20542
+ },
20543
+ },
20299
20544
  {
20300
20545
  funName: 'YJTREND',
20301
20546
  funDesc: '返回线性回归拟合线的一组纵坐标值(y值)',