hqchart 1.1.14340 → 1.1.14349

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.
@@ -28443,6 +28443,12 @@ function IChartPainting()
28443
28443
 
28444
28444
  }
28445
28445
 
28446
+ this.BuildKey=function(item)
28447
+ {
28448
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
28449
+ else return item.Date;
28450
+ }
28451
+
28446
28452
  //数据导出 数据格式 [{ Title:数据名称, Data:[] }]
28447
28453
  //this.ExportData=function(aryKData) { }
28448
28454
 
@@ -44380,159 +44386,285 @@ function ChartMultiBar()
44380
44386
  delete this.newMethod;
44381
44387
 
44382
44388
  this.ClassName="ChartMultiBar";
44383
- this.Bars=[]; // [ {Point:[ {Index, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
44389
+ this.Bars=[]; // [ {Point:[ {Date, Time, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
44384
44390
  this.IsHScreen=false;
44385
44391
 
44392
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44393
+ this.GetKValue=ChartData.GetKValue;
44394
+
44395
+ this.GetItem=function(kItem)
44396
+ {
44397
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44398
+
44399
+ var key=this.BuildKey(kItem);
44400
+ if (!this.MapCache.has(key)) return null;
44401
+
44402
+ return this.MapCache.get(key);
44403
+ }
44404
+
44405
+ this.BuildCacheData=function()
44406
+ {
44407
+ var mapData=new Map();
44408
+ this.MapCache=mapData;
44409
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Bars)) return;
44410
+
44411
+ for(var i=0; i<this.Bars.length; ++i)
44412
+ {
44413
+ var groupItem=this.Bars[i];
44414
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44415
+
44416
+ var clrConfig= { Color:groupItem.Color, Width:5, Name:groupItem.Name, Type:0 };
44417
+ if (IFrameSplitOperator.IsNumber(groupItem.Width)) clrConfig.Width=groupItem.Width;
44418
+ if (IFrameSplitOperator.IsNumber(groupItem.Type)) clrConfig.Type=groupItem.Type;
44419
+
44420
+ for(var j=0; j<groupItem.Point.length; ++j)
44421
+ {
44422
+ var point=groupItem.Point[j];
44423
+ var key=this.BuildKey(point);
44424
+
44425
+ var item={ Data:point, ColorConfig:clrConfig }
44426
+ if (mapData.has(key))
44427
+ {
44428
+ var mapItem=mapData.get(key);
44429
+ mapItem.Data.push(item);
44430
+ }
44431
+ else
44432
+ {
44433
+ mapData.set(key,{ Data:[item] });
44434
+ }
44435
+ }
44436
+ }
44437
+ }
44438
+
44386
44439
  this.Draw=function()
44387
44440
  {
44388
44441
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44389
44442
  if (this.IsShowIndexTitleOnly()) return;
44390
44443
  if (this.IsHideScriptIndex()) return;
44391
- if (!this.Data || this.Data.length<=0) return;
44444
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44445
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Bars)) return;
44446
+ if (!this.MapCache || this.MapCache.size<=0) return;
44392
44447
 
44393
44448
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44394
44449
  var xPointCount=this.ChartFrame.XPointCount;
44395
- var offset=this.Data.DataOffset;
44396
44450
  var dataWidth=this.ChartFrame.DataWidth;
44397
- var pixelRatio=GetDevicePixelRatio();
44451
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44452
+ var isMinute=this.IsMinuteFrame();
44398
44453
 
44399
- var drawBars=[];
44400
- for(var i in this.Bars)
44454
+ var border=this.GetBorder();
44455
+ if (this.IsHScreen)
44401
44456
  {
44402
- var item=this.Bars[i];
44403
- var drawPoints={ Point:[], Color:item.Color, Width:dataWidth, Type:0 };
44404
- if (item.Type>0) drawPoints.Type=item.Type;
44405
- if (item.Width>0)
44406
- {
44407
- drawPoints.Width=item.Width*pixelRatio;
44408
- if (drawPoints.Width>dataWidth) drawPoints.Width=dataWidth;
44409
- }
44410
- else
44411
- {
44412
- if(drawPoints.Width<4) drawPoints.Width=1*pixelRatio;
44413
- }
44414
-
44415
- for(var j in item.Point)
44416
- {
44417
- var point=item.Point[j];
44418
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
44419
-
44420
- var index=point.Index-offset;
44421
- if (index>=0 && index<xPointCount)
44422
- {
44423
- var x=this.ChartFrame.GetXFromIndex(index);
44424
- var y=this.ChartFrame.GetYFromData(point.Value);
44425
- var y2=this.ChartFrame.GetYFromData(point.Value2);
44426
- drawPoints.Point.push({X:x, Y:y, Y2:y2});
44427
- }
44428
- }
44429
-
44430
- if (drawPoints.Point.length>0) drawBars.push(drawPoints)
44457
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44458
+ var chartright=border.BottomEx;
44459
+ var chartLeft=border.TopEx;
44431
44460
  }
44432
-
44433
- for(var i in drawBars)
44461
+ else
44434
44462
  {
44435
- var item=drawBars[i];
44436
- if (item.Width>=4)
44437
- {
44438
- if (item.Type==1) this.DrawHollowBar(item);
44439
- else this.DrawFillBar(item);
44440
- }
44441
- else
44442
- {
44443
- this.DrawLineBar(item);
44444
- }
44463
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44464
+ var chartright=border.RightEx;
44465
+ var chartLeft=border.LeftEx;
44445
44466
  }
44446
- }
44447
44467
 
44448
- this.DrawLineBar=function(bar)
44449
- {
44450
- this.Canvas.strokeStyle=bar.Color;
44451
- var backupLineWidth=this.Canvas.lineWidth;
44452
- this.Canvas.lineWidth=bar.Width;
44453
- for(var i in bar.Point)
44468
+ //计算所有柱子位置
44469
+ var mapBar=new Map();
44470
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44454
44471
  {
44455
- var item=bar.Point[i];
44472
+ var kItem=this.Data.Data[i];
44473
+ var key=this.BuildKey(kItem);
44474
+ if (!this.MapCache.has(key)) continue;
44475
+ var mapItem=this.MapCache.get(key);
44476
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44456
44477
 
44457
- this.Canvas.beginPath();
44458
- if (this.IsHScreen)
44478
+ if (isMinute)
44459
44479
  {
44460
- this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));
44461
- this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));
44480
+ var x=this.ChartFrame.GetXFromIndex(j);
44462
44481
  }
44463
44482
  else
44464
44483
  {
44465
- this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));
44466
- this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));
44484
+ var left=xOffset;
44485
+ var right=xOffset+dataWidth;
44486
+ if (right>chartright) break;
44487
+ var x=left+(right-left)/2;
44467
44488
  }
44468
-
44469
- this.Canvas.stroke();
44489
+
44490
+ this.CalculateItem(mapItem, kItem, x, mapBar);
44470
44491
  }
44471
44492
 
44472
- this.Canvas.lineWidth=backupLineWidth;
44493
+ if (mapBar.size<=0) return;
44494
+
44495
+ this.Canvas.save();
44496
+ this.ClipClient(this.IsHScreen);
44497
+
44498
+ this.DrawAllBar(mapBar);
44499
+
44500
+ this.Canvas.restore();
44473
44501
  }
44474
44502
 
44475
- this.DrawFillBar=function(bar)
44503
+ this.CalculateItem=function(groupItem, kItem, x, mapBar)
44476
44504
  {
44477
- this.Canvas.fillStyle=bar.Color;
44478
- for(var i in bar.Point)
44505
+ for(var i=0; i<groupItem.Data.length; ++i)
44479
44506
  {
44480
- var item=bar.Point[i];
44481
- var x=item.X-(bar.Width/2);
44482
- var y=Math.min(item.Y,item.Y2);
44483
- var barWidth=bar.Width;
44484
- var barHeight=Math.abs(item.Y-item.Y2);
44485
- if (this.IsHScreen)
44486
- this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth));
44487
- else
44488
- this.Canvas.fillRect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight));
44507
+ var item=groupItem.Data[i];
44508
+ var value=item.Data.Value;
44509
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44510
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44511
+
44512
+ var value2=item.Data.Value2;
44513
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=this.GetKValue(kItem,item.Data.Value2);
44514
+ if (!IFrameSplitOperator.IsNumber(value2)) continue;
44515
+
44516
+ var y=this.ChartFrame.GetYFromData(value, false);
44517
+ var y2=this.ChartFrame.GetYFromData(value2, false);
44518
+
44519
+ var strConfig=JSON.stringify(item.ColorConfig);
44520
+ if (!mapBar.has(strConfig)) mapBar.set(strConfig, { AryBar:[]});
44521
+ var mapItem=mapBar.get(strConfig);
44522
+
44523
+ mapItem.AryBar.push({ X:x, Y:y, Y2:y2, Data:item });
44489
44524
  }
44490
44525
  }
44491
44526
 
44492
- this.DrawHollowBar=function(bar) //空心柱子
44527
+
44528
+ this.DrawAllBar=function(mapBar)
44493
44529
  {
44494
- this.Canvas.strokeStyle=bar.Color;
44495
- var backupLineWidth=1;
44496
- for(var i in bar.Point)
44530
+ var pixelRatio=GetDevicePixelRatio();
44531
+
44532
+ for(var mapItem of mapBar)
44497
44533
  {
44498
- var item=bar.Point[i];
44499
- var x=item.X-(bar.Width/2);
44500
- var y=Math.min(item.Y,item.Y2);
44501
- var barWidth=bar.Width;
44502
- var barHeight=Math.abs(item.Y-item.Y2);
44503
- this.Canvas.beginPath();
44504
- if (this.IsHScreen)
44505
- this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedRect(barHeight),ToFixedRect(barWidth));
44506
- else
44507
- this.Canvas.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedRect(barWidth),ToFixedRect(barHeight));
44534
+ aryBar=mapItem[1].AryBar;
44535
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryBar)) continue;
44508
44536
 
44509
- this.Canvas.stroke();
44510
- }
44537
+ var config=null;
44538
+ var path=new Path2D();
44539
+ var count=0;
44540
+ var drawType=-1; //1=直线 2=实心 3=空心
44541
+ var barWidth=1;
44542
+ for(var i=0;i<aryBar.length;++i)
44543
+ {
44544
+ var item=aryBar[i];
44545
+ if (!config)
44546
+ {
44547
+ config=item.Data.ColorConfig;
44548
+ barWidth=config.Width*pixelRatio;
44549
+ if (barWidth>4)
44550
+ {
44551
+ if (config.Type==0) drawType=2; //实心
44552
+ else if (config.Type==1) drawType=3; //空心
44553
+ else continue;
44554
+ }
44555
+ else //太细了, 直线
44556
+ {
44557
+ drawType=1;
44558
+ }
44559
+ }
44511
44560
 
44512
- this.Canvas.lineWidth=backupLineWidth;
44561
+ if (drawType<=0) continue;
44562
+
44563
+ if (drawType==1)
44564
+ {
44565
+ this.Canvas.beginPath();
44566
+ if (this.IsHScreen)
44567
+ {
44568
+ this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));
44569
+ this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));
44570
+ }
44571
+ else
44572
+ {
44573
+ this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));
44574
+ this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));
44575
+ }
44576
+ ++count;
44577
+ }
44578
+ else if (drawType==2) //实心
44579
+ {
44580
+ var x=item.X-(barWidth/2);
44581
+ var y=Math.min(item.Y,item.Y2);
44582
+ var barWidth=barWidth;
44583
+ var barHeight=Math.abs(item.Y-item.Y2);
44584
+
44585
+ var barPath = new Path2D();
44586
+ if (this.IsHScreen)
44587
+ barPath.rect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth))
44588
+ else
44589
+ barPath.rect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight))
44590
+
44591
+ path.addPath(barPath);
44592
+ ++count;
44593
+ }
44594
+ else if (drawType==3) //空心
44595
+ {
44596
+ var x=item.X-(barWidth/2);
44597
+ var y=Math.min(item.Y,item.Y2);
44598
+ var barWidth=barWidth;
44599
+ var barHeight=Math.abs(item.Y-item.Y2);
44600
+
44601
+ var barPath = new Path2D();
44602
+ if (this.IsHScreen)
44603
+ barPath.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedPoint(barHeight),ToFixedPoint(barWidth))
44604
+ else
44605
+ barPath.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedPoint(barWidth),ToFixedPoint(barHeight))
44606
+
44607
+ path.addPath(barPath);
44608
+ ++count;
44609
+ }
44610
+ }
44611
+
44612
+
44613
+ if (count>0 && drawType>0 && config)
44614
+ {
44615
+ if (drawType==1)
44616
+ {
44617
+ this.Canvas.lineWidth=1*pixelRatio;
44618
+ this.Canvas.strokeStyle=config.Color;
44619
+ this.Canvas.stroke();
44620
+ }
44621
+ else if (drawType==2)
44622
+ {
44623
+ this.Canvas.fillStyle=config.Color; //背景填充颜色
44624
+ this.Canvas.fill(path);
44625
+ }
44626
+ else if (drawType==3)
44627
+ {
44628
+ this.Canvas.lineWidth=1*pixelRatio;
44629
+ this.Canvas.strokeStyle=config.Color;
44630
+ this.Canvas.stroke(path);
44631
+ }
44632
+ }
44633
+
44634
+ }
44513
44635
  }
44514
44636
 
44515
44637
  this.GetMaxMin=function()
44516
44638
  {
44517
44639
  var range={ Min:null, Max:null };
44640
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
44641
+ if (!this.MapCache || this.MapCache.size<=0) return range;
44518
44642
  var xPointCount=this.ChartFrame.XPointCount;
44519
- var start=this.Data.DataOffset;
44520
- var end=start+xPointCount;
44521
- for(var i in this.Bars)
44643
+
44644
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44522
44645
  {
44523
- var item=this.Bars[i];
44524
- for(var j in item.Point)
44646
+ var kItem=this.Data.Data[i];
44647
+ var key=this.BuildKey(kItem);
44648
+ if (!this.MapCache.has(key)) continue;
44649
+ var mapItem=this.MapCache.get(key);
44650
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44651
+
44652
+ for(k=0;k<mapItem.Data.length;++k)
44525
44653
  {
44526
- var point=item.Point[j];
44527
- if (point.Index>=start && point.Index<end)
44528
- {
44529
- var minValue=Math.min(point.Value,point.Value2);
44530
- var maxValue=Math.max(point.Value,point.Value2);
44531
- if (range.Max==null) range.Max=maxValue;
44532
- else if (range.Max<maxValue) range.Max=maxValue;
44533
- if (range.Min==null) range.Min=minValue;
44534
- else if (range.Min>minValue) range.Min=minValue;
44535
- }
44654
+ var item=mapItem.Data[k];
44655
+ var value=item.Data.Value;
44656
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44657
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44658
+ var value2=item.Data.Value2;
44659
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=this.GetKValue(kItem,item.Data.Value2);
44660
+ if (!IFrameSplitOperator.IsNumber(value2)) continue;
44661
+
44662
+ var minValue=Math.min(value, value2);
44663
+ var maxValue=Math.max(value, value2);
44664
+ if (range.Max==null) range.Max=maxValue;
44665
+ else if (range.Max<maxValue) range.Max=maxValue;
44666
+ if (range.Min==null) range.Min=minValue;
44667
+ else if (range.Min>minValue) range.Min=minValue;
44536
44668
  }
44537
44669
  }
44538
44670
 
@@ -44874,7 +45006,7 @@ function ChartMultiLine()
44874
45006
  }
44875
45007
  }
44876
45008
 
44877
- // 多个点集合 支持横屏
45009
+ // 多个点集合2.0 支持横屏
44878
45010
  function ChartMultiPoint()
44879
45011
  {
44880
45012
  this.newMethod=IChartPainting; //派生
@@ -44892,12 +45024,6 @@ function ChartMultiPoint()
44892
45024
  this.MapCache=null; //key=date/date-time value={ Data:[] }
44893
45025
  this.GetKValue=ChartData.GetKValue;
44894
45026
 
44895
- this.BuildKey=function(item)
44896
- {
44897
- if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44898
- else return item.Date;
44899
- }
44900
-
44901
45027
  this.GetItem=function(kItem)
44902
45028
  {
44903
45029
  if (!this.MapCache || this.MapCache.size<=0) return null;
@@ -44921,6 +45047,7 @@ function ChartMultiPoint()
44921
45047
 
44922
45048
  var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44923
45049
  if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
45050
+ if (IFrameSplitOperator.IsNumber(groupItem.LineWidth)) clrConfig.LineWidth=groupItem.LineWidth;
44924
45051
 
44925
45052
  for(var j=0; j<groupItem.Point.length; ++j)
44926
45053
  {
@@ -45073,7 +45200,7 @@ function ChartMultiPoint()
45073
45200
  {
45074
45201
  var range={ Min:null, Max:null };
45075
45202
  if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45076
- if (!this.MapCache || this.MapCache.size<=0) return;
45203
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45077
45204
  var xPointCount=this.ChartFrame.XPointCount;
45078
45205
 
45079
45206
  for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
@@ -45102,7 +45229,7 @@ function ChartMultiPoint()
45102
45229
  }
45103
45230
  }
45104
45231
 
45105
- // 多文本集合 支持横屏
45232
+ // 多文本集合2.0 支持横屏
45106
45233
  function ChartMultiText()
45107
45234
  {
45108
45235
  this.newMethod=IChartPainting; //派生
@@ -45110,58 +45237,38 @@ function ChartMultiText()
45110
45237
  delete this.newMethod;
45111
45238
 
45112
45239
  this.ClassName="ChartMultiText";
45113
- this.Texts=[]; //[ {Index:, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 }} ]
45240
+ this.Texts=[]; //[ {Date:, Time, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 }} ]
45114
45241
  this.Font=g_JSChartResource.DefaultTextFont;
45115
45242
  this.Color=g_JSChartResource.DefaultTextColor;
45116
45243
  this.IsHScreen=false; //是否横屏
45117
45244
 
45118
- this.BuildKey=function(item)
45119
- {
45120
- if (IFrameSplitOperator.IsNumber(item.Time))
45121
- {
45122
- var key=`${item.Date}-${item.Time}`;
45123
- }
45124
- else
45125
- {
45126
- var key=`${item.Date}`;
45127
- }
45128
-
45129
- return key;
45130
- }
45245
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
45246
+ this.GetKValue=ChartData.GetKValue;
45131
45247
 
45132
- this.GetShowTextData=function()
45248
+ this.BuildCacheData=function()
45133
45249
  {
45134
- var xPointCount=this.ChartFrame.XPointCount;
45135
- var offset=this.Data.DataOffset;
45250
+ var mapData=new Map();
45251
+ this.MapCache=mapData;
45252
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45136
45253
 
45137
- var mapText=new Map(); //key='date-time' value={ Data:[] }
45138
- for(var i=0; i<this.Texts.length; ++i)
45254
+ for(var i=0;i<this.Texts.length;++i)
45139
45255
  {
45140
45256
  var item=this.Texts[i];
45141
- if (!item.Text) continue;
45142
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
45143
-
45144
- var index=item.Index-offset;
45145
- if (index>=0 && index<xPointCount)
45257
+ var key=this.BuildKey(item);
45258
+ if (mapData.has(key))
45146
45259
  {
45147
- var key=this.BuildKey(item);
45148
- if (mapText.has(key))
45149
- {
45150
- var textItem=mapText.get(key);
45151
- textItem.Data.push(item);
45152
- }
45153
- else
45154
- {
45155
- var textItem={ Data:[item] };
45156
- mapText.set(key, textItem);
45157
- }
45260
+ var mapItem=mapData.get(key);
45261
+ mapItem.Data.push(item);
45262
+ }
45263
+ else
45264
+ {
45265
+ mapData.set(key,{ Data:[item] });
45158
45266
  }
45159
45267
  }
45160
-
45161
- return mapText;
45162
45268
  }
45163
45269
 
45164
- this.DrawAllText=function(mapText)
45270
+
45271
+ this.DrawAllText=function()
45165
45272
  {
45166
45273
  var bHScreen=(this.ChartFrame.IsHScreen===true);
45167
45274
  var isMinute=this.IsMinuteFrame();
@@ -45198,21 +45305,29 @@ function ChartMultiText()
45198
45305
  if (!kItem) continue;
45199
45306
 
45200
45307
  var key=this.BuildKey(kItem);
45201
- if (!mapText.has(key)) continue;
45308
+ if (!this.MapCache.has(key)) continue;
45309
+ var mapItem=this.MapCache.get(key);
45310
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45202
45311
 
45203
45312
  var left=xOffset;
45204
45313
  var right=xOffset+dataWidth;
45205
45314
  if (right>chartright) break;
45206
45315
  var x=left+(right-left)/2;
45207
45316
 
45208
- var textItem=mapText.get(key);
45209
- for(var k=0;k<textItem.Data.length;++k)
45317
+ for(var k=0;k<mapItem.Data.length;++k)
45210
45318
  {
45211
- var item=textItem.Data[k];
45319
+ var item=mapItem.Data[k];
45212
45320
  var y=top;
45213
45321
  if (item.Value=="TOP") y=top;
45214
45322
  else if (item.Value=="BOTTOM") y=bottom;
45215
- else y=this.ChartFrame.GetYFromData(item.Value, false);
45323
+ else
45324
+ {
45325
+ var price=item.Value;
45326
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
45327
+
45328
+ y=this.ChartFrame.GetYFromData(price, false);
45329
+ }
45330
+
45216
45331
 
45217
45332
  if (item.Color) this.Canvas.fillStyle = item.Color;
45218
45333
  else this.Canvas.fillStyle = this.Color;
@@ -45297,18 +45412,16 @@ function ChartMultiText()
45297
45412
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
45298
45413
  if (this.IsShowIndexTitleOnly()) return;
45299
45414
  if (this.IsHideScriptIndex()) return;
45300
- if (!this.Data || this.Data.length<=0) return;
45301
- if (!this.Texts) return;
45415
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
45416
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45417
+ if (!this.MapCache || this.MapCache.size<=0) return;
45302
45418
 
45303
45419
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45304
45420
 
45305
- var mapText=this.GetShowTextData();
45306
- if (mapText.size<=0) return;
45307
-
45308
45421
  this.Canvas.save();
45309
45422
  this.ClipClient(this.IsHScreen);
45310
45423
 
45311
- this.DrawAllText(mapText);
45424
+ this.DrawAllText();
45312
45425
 
45313
45426
  this.Canvas.restore();
45314
45427
  }
@@ -45318,21 +45431,29 @@ function ChartMultiText()
45318
45431
  var range={ Min:null, Max:null };
45319
45432
  if (!this.Texts) return range;
45320
45433
 
45434
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45435
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45321
45436
  var xPointCount=this.ChartFrame.XPointCount;
45322
- var start=this.Data.DataOffset;
45323
- var end=start+xPointCount;
45324
45437
 
45325
- for(var i in this.Texts)
45438
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45326
45439
  {
45327
- var item=this.Texts[i];
45328
- if (!IFrameSplitOperator.IsNumber(item.Value)) continue;
45440
+ var kItem=this.Data.Data[i];
45441
+ var key=this.BuildKey(kItem);
45442
+ if (!this.MapCache.has(key)) continue;
45443
+ var mapItem=this.MapCache.get(key);
45444
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45329
45445
 
45330
- if (item.Index>=start && item.Index<end)
45446
+ for(k=0;k<mapItem.Data.length;++k)
45331
45447
  {
45332
- if (range.Max==null) range.Max=item.Value;
45333
- else if (range.Max<item.Value) range.Max=item.Value;
45334
- if (range.Min==null) range.Min=item.Value;
45335
- else if (range.Min>item.Value) range.Min=item.Value;
45448
+ var item=mapItem.Data[k];
45449
+ var value=item.Value;
45450
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
45451
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45452
+
45453
+ if (range.Max==null) range.Max=value;
45454
+ else if (range.Max<value) range.Max=value;
45455
+ if (range.Min==null) range.Min=value;
45456
+ else if (range.Min>value) range.Min=value;
45336
45457
  }
45337
45458
  }
45338
45459
 
@@ -45849,7 +45970,7 @@ function ChartMultiHtmlDom()
45849
45970
  }
45850
45971
  }
45851
45972
 
45852
- //绘制SVG图标
45973
+ //绘制SVG图标 2.0
45853
45974
  function ChartDrawSVG()
45854
45975
  {
45855
45976
  this.newMethod=IChartPainting; //派生
@@ -61463,6 +61584,41 @@ function DynamicChartTitlePainting()
61463
61584
  return aryText;
61464
61585
  }
61465
61586
 
61587
+ this.ForamtMultiBarTitle=function(dataIndex, dataInfo)
61588
+ {
61589
+ if (!dataInfo.GetItemCallback) return null;
61590
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61591
+ var kItem=dataInfo.Data.Data[dataIndex];
61592
+ if (!kItem) return null;
61593
+
61594
+ var group=dataInfo.GetItemCallback(kItem);
61595
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61596
+
61597
+ var aryText=[];
61598
+ for(var i=0;i<group.Data.length;++i)
61599
+ {
61600
+ var item=group.Data[i];
61601
+ var config=item.ColorConfig;
61602
+
61603
+ var color=null;
61604
+ if (config.BGColor) color=config.BGColor;
61605
+ else if (config.Color) color=config.Color;
61606
+
61607
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61608
+
61609
+ var value=item.Data.Value;
61610
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61611
+
61612
+ var value2=item.Data.Value2;
61613
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=ChartData.GetKValue(kItem, item.Data.Value2);
61614
+ aryText.push({ Text:`[${this.FormatValue(value, dataInfo)}, ${this.FormatValue(value2, dataInfo)}] `, Color:color});
61615
+ }
61616
+
61617
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
61618
+
61619
+ return aryText;
61620
+ }
61621
+
61466
61622
  this.FormatVPVRTitle=function(pt, dataInfo)
61467
61623
  {
61468
61624
  var chart=dataInfo.Chart;
@@ -61806,6 +61962,12 @@ function DynamicChartTitlePainting()
61806
61962
  if (!aryText) return null;
61807
61963
  return { Text:null, ArrayText:aryText };
61808
61964
  }
61965
+ else if (item.DataType=="ChartMultiBar")
61966
+ {
61967
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
61968
+ if (!aryText) return null;
61969
+ return { Text:null, ArrayText:aryText };
61970
+ }
61809
61971
 
61810
61972
  value=item.Data.Data[dataIndex];
61811
61973
 
@@ -62231,6 +62393,11 @@ function DynamicChartTitlePainting()
62231
62393
  aryText=this.ForamtMultiPointTitle(dataIndex, item);
62232
62394
  if (!aryText) continue;
62233
62395
  }
62396
+ else if (item.DataType=="ChartMultiBar")
62397
+ {
62398
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
62399
+ if (!aryText) continue;
62400
+ }
62234
62401
  else
62235
62402
  {
62236
62403
  valueText=this.FormatValue(value,item);
@@ -123259,7 +123426,7 @@ function ScriptIndex(name,script,args,option)
123259
123426
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123260
123427
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123261
123428
 
123262
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123429
+ chart.Data=hqChart.GetKData(); //绑定K线
123263
123430
  chart.PointGroup=varItem.Draw.DrawData;
123264
123431
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123265
123432
  chart.BuildCacheData();
@@ -123282,17 +123449,18 @@ function ScriptIndex(name,script,args,option)
123282
123449
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123283
123450
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123284
123451
 
123285
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123452
+ chart.Data=hqChart.GetKData();//绑定K线
123286
123453
  chart.Bars=varItem.Draw.DrawData;
123287
-
123288
- var titleIndex=windowIndex+1;
123289
- var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
123290
- titleData.IsShow=false;
123291
- titleData.DataType="MULTI_BAR";
123292
- hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123454
+ chart.BuildCacheData();
123293
123455
 
123294
123456
  this.SetChartIndexName(chart);
123295
123457
  hqChart.ChartPaint.push(chart);
123458
+
123459
+ var titleIndex=windowIndex+1;
123460
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
123461
+ titleData.DataType="ChartMultiBar";
123462
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123463
+ hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123296
123464
  }
123297
123465
 
123298
123466
  this.CreateMultiText=function(hqChart,windowIndex,varItem,i)
@@ -123303,8 +123471,10 @@ function ScriptIndex(name,script,args,option)
123303
123471
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123304
123472
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123305
123473
 
123306
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123474
+ chart.Data=hqChart.GetKData();//绑定K线
123307
123475
  chart.Texts=varItem.Draw.DrawData;
123476
+ chart.BuildCacheData();
123477
+
123308
123478
  this.SetChartIndexName(chart);
123309
123479
  hqChart.ChartPaint.push(chart);
123310
123480
  }
@@ -123317,7 +123487,7 @@ function ScriptIndex(name,script,args,option)
123317
123487
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123318
123488
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123319
123489
 
123320
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123490
+ chart.Data=hqChart.GetKData();//绑定K线
123321
123491
  chart.Family=varItem.Draw.DrawData.Family;
123322
123492
  chart.AryIcon= varItem.Draw.DrawData.Icon;
123323
123493
  chart.BuildCacheData();
@@ -123333,10 +123503,8 @@ function ScriptIndex(name,script,args,option)
123333
123503
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123334
123504
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123335
123505
 
123336
- if (hqChart.ChartPaint[0].IsMinuteFrame())
123337
- chart.Data=hqChart.SourceData;
123338
- else
123339
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123506
+
123507
+ chart.Data=hqChart.GetKData()
123340
123508
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
123341
123509
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
123342
123510
  if (varItem.Draw.BuildKeyCallback) chart.BuildKeyCallback=varItem.Draw.BuildKeyCallback;
@@ -124844,11 +125012,7 @@ function OverlayScriptIndex(name,script,args,option)
124844
125012
  chart.ChartFrame=frame.Frame;
124845
125013
  chart.Identify=overlayIndex.Identify;
124846
125014
 
124847
- if (hqChart.ChartPaint[0].IsMinuteFrame())
124848
- chart.Data=hqChart.SourceData;
124849
- else
124850
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
124851
-
125015
+ chart.Data=hqChart.GetKData();
124852
125016
  chart.Family=varItem.Draw.Icon.Family;
124853
125017
  chart.TextFont=g_JSChartResource.TIPICON.TextFont;
124854
125018
 
@@ -124996,7 +125160,7 @@ function OverlayScriptIndex(name,script,args,option)
124996
125160
  chart.ChartFrame=frame.Frame;
124997
125161
  chart.Identify=overlayIndex.Identify;
124998
125162
 
124999
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125163
+ chart.Data=hqChart.GetKData();//绑定K线
125000
125164
  chart.PointGroup=varItem.Draw.DrawData;
125001
125165
  chart.BuildCacheData();
125002
125166
 
@@ -125046,14 +125210,16 @@ function OverlayScriptIndex(name,script,args,option)
125046
125210
  chart.ChartFrame=frame.Frame;
125047
125211
  chart.Identify=overlayIndex.Identify;
125048
125212
 
125049
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125213
+ chart.Data=hqChart.GetKData();//绑定K线
125050
125214
  chart.Bars=varItem.Draw.DrawData;
125215
+ chart.BuildCacheData();
125051
125216
 
125052
125217
  var titleIndex=windowIndex+1;
125053
125218
  var titlePaint=hqChart.TitlePaint[titleIndex];
125054
- var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
125055
- titleData.IsShow=false;
125056
- titleData.DataType="MULTI_BAR";
125219
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
125220
+ titleData.DataType="ChartMultiBar";
125221
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
125222
+
125057
125223
  titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
125058
125224
 
125059
125225
  this.SetChartIndexName(chart);
@@ -125071,8 +125237,10 @@ function OverlayScriptIndex(name,script,args,option)
125071
125237
  chart.ChartFrame=frame.Frame;
125072
125238
  chart.Identify=overlayIndex.Identify;
125073
125239
 
125074
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125240
+ chart.Data=hqChart.GetKData();//绑定K线
125075
125241
  chart.Texts=varItem.Draw.DrawData;
125242
+ chart.BuildCacheData();
125243
+
125076
125244
  this.SetChartIndexName(chart);
125077
125245
  frame.ChartPaint.push(chart);
125078
125246
  }
@@ -125088,7 +125256,7 @@ function OverlayScriptIndex(name,script,args,option)
125088
125256
  chart.ChartFrame=frame.Frame;
125089
125257
  chart.Identify=overlayIndex.Identify;
125090
125258
 
125091
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125259
+ chart.Data=hqChart.GetKData();//绑定K线
125092
125260
  chart.Family=varItem.Draw.DrawData.Family;
125093
125261
  chart.AryIcon= varItem.Draw.DrawData.Icon;
125094
125262
  chart.BuildCacheData();
@@ -125106,11 +125274,8 @@ function OverlayScriptIndex(name,script,args,option)
125106
125274
  chart.ChartBorder=frame.Frame.ChartBorder;
125107
125275
  chart.ChartFrame=frame.Frame;
125108
125276
  chart.Identify=overlayIndex.Identify;
125109
-
125110
- if (hqChart.ChartPaint[0].IsMinuteFrame())
125111
- chart.Data=hqChart.SourceData;
125112
- else
125113
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125277
+ chart.Data=hqChart.GetKData();
125278
+
125114
125279
 
125115
125280
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
125116
125281
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
@@ -126215,7 +126380,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126215
126380
  drawItem.Text=draw.Text;
126216
126381
  drawItem.Name=draw.Name;
126217
126382
  drawItem.DrawType=draw.DrawType;
126218
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126383
+ drawItem.DrawData=draw.DrawData;
126219
126384
  outVarItem.Draw=drawItem;
126220
126385
 
126221
126386
  result.push(outVarItem);
@@ -126266,8 +126431,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126266
126431
  drawItem.Text=draw.Text;
126267
126432
  drawItem.Name=draw.Name;
126268
126433
  drawItem.DrawType=draw.DrawType;
126269
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126270
- this.GetKLineData(drawItem.DrawData, hqChart);
126434
+ drawItem.DrawData=draw.DrawData;
126271
126435
  outVarItem.Draw=drawItem;
126272
126436
  result.push(outVarItem);
126273
126437
  }
@@ -126762,8 +126926,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126762
126926
  drawItem.Text=draw.Text;
126763
126927
  drawItem.Name=draw.Name;
126764
126928
  drawItem.DrawType=draw.DrawType;
126765
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126766
- this.GetKLineData(drawItem.DrawData, hqChart);
126929
+ drawItem.DrawData=draw.DrawData;
126767
126930
  outVarItem.Draw=drawItem;
126768
126931
  result.push(outVarItem);
126769
126932
  }
@@ -152212,7 +152375,7 @@ function HQChartScriptWorker()
152212
152375
 
152213
152376
 
152214
152377
 
152215
- var HQCHART_VERSION="1.1.14339";
152378
+ var HQCHART_VERSION="1.1.14348";
152216
152379
 
152217
152380
  function PrintHQChartVersion()
152218
152381
  {