hqchart 1.1.14340 → 1.1.14354

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);
44534
+ var aryBar=mapItem[1].AryBar;
44535
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryBar)) continue;
44536
+
44537
+ var config=null;
44538
+ var path=new Path2D();
44539
+ var count=0;
44540
+ var drawType=-1; //1=直线 2=实心 3=空心
44541
+ var barWidth=1;
44503
44542
  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));
44543
+ for(var i=0;i<aryBar.length;++i)
44544
+ {
44545
+ var item=aryBar[i];
44546
+ if (!config)
44547
+ {
44548
+ config=item.Data.ColorConfig;
44549
+ barWidth=config.Width*pixelRatio;
44550
+ if (barWidth>4)
44551
+ {
44552
+ if (config.Type==0) drawType=2; //实心
44553
+ else if (config.Type==1) drawType=3; //空心
44554
+ else continue;
44555
+ }
44556
+ else //太细了, 直线
44557
+ {
44558
+ drawType=1;
44559
+ }
44560
+ }
44508
44561
 
44509
- this.Canvas.stroke();
44510
- }
44562
+ if (drawType<=0) continue;
44511
44563
 
44512
- this.Canvas.lineWidth=backupLineWidth;
44564
+ if (drawType==1)
44565
+ {
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;
@@ -45252,7 +45367,6 @@ function ChartMultiText()
45252
45367
 
45253
45368
  if (item.Line)
45254
45369
  {
45255
- var kItem=this.Data.Data[item.Index];
45256
45370
  var price=item.Line.KData=="H"? kItem.High:kItem.Low;
45257
45371
  var yPrice=this.ChartFrame.GetYFromData(price, false);
45258
45372
  var yText=y;
@@ -45297,18 +45411,16 @@ function ChartMultiText()
45297
45411
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
45298
45412
  if (this.IsShowIndexTitleOnly()) return;
45299
45413
  if (this.IsHideScriptIndex()) return;
45300
- if (!this.Data || this.Data.length<=0) return;
45301
- if (!this.Texts) return;
45414
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
45415
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45416
+ if (!this.MapCache || this.MapCache.size<=0) return;
45302
45417
 
45303
45418
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45304
45419
 
45305
- var mapText=this.GetShowTextData();
45306
- if (mapText.size<=0) return;
45307
-
45308
45420
  this.Canvas.save();
45309
45421
  this.ClipClient(this.IsHScreen);
45310
45422
 
45311
- this.DrawAllText(mapText);
45423
+ this.DrawAllText();
45312
45424
 
45313
45425
  this.Canvas.restore();
45314
45426
  }
@@ -45318,21 +45430,29 @@ function ChartMultiText()
45318
45430
  var range={ Min:null, Max:null };
45319
45431
  if (!this.Texts) return range;
45320
45432
 
45433
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45434
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45321
45435
  var xPointCount=this.ChartFrame.XPointCount;
45322
- var start=this.Data.DataOffset;
45323
- var end=start+xPointCount;
45324
45436
 
45325
- for(var i in this.Texts)
45437
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45326
45438
  {
45327
- var item=this.Texts[i];
45328
- if (!IFrameSplitOperator.IsNumber(item.Value)) continue;
45439
+ var kItem=this.Data.Data[i];
45440
+ var key=this.BuildKey(kItem);
45441
+ if (!this.MapCache.has(key)) continue;
45442
+ var mapItem=this.MapCache.get(key);
45443
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45329
45444
 
45330
- if (item.Index>=start && item.Index<end)
45445
+ for(k=0;k<mapItem.Data.length;++k)
45331
45446
  {
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;
45447
+ var item=mapItem.Data[k];
45448
+ var value=item.Value;
45449
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
45450
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45451
+
45452
+ if (range.Max==null) range.Max=value;
45453
+ else if (range.Max<value) range.Max=value;
45454
+ if (range.Min==null) range.Min=value;
45455
+ else if (range.Min>value) range.Min=value;
45336
45456
  }
45337
45457
  }
45338
45458
 
@@ -45849,7 +45969,7 @@ function ChartMultiHtmlDom()
45849
45969
  }
45850
45970
  }
45851
45971
 
45852
- //绘制SVG图标
45972
+ //绘制SVG图标 2.0
45853
45973
  function ChartDrawSVG()
45854
45974
  {
45855
45975
  this.newMethod=IChartPainting; //派生
@@ -61463,6 +61583,41 @@ function DynamicChartTitlePainting()
61463
61583
  return aryText;
61464
61584
  }
61465
61585
 
61586
+ this.ForamtMultiBarTitle=function(dataIndex, dataInfo)
61587
+ {
61588
+ if (!dataInfo.GetItemCallback) return null;
61589
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61590
+ var kItem=dataInfo.Data.Data[dataIndex];
61591
+ if (!kItem) return null;
61592
+
61593
+ var group=dataInfo.GetItemCallback(kItem);
61594
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61595
+
61596
+ var aryText=[];
61597
+ for(var i=0;i<group.Data.length;++i)
61598
+ {
61599
+ var item=group.Data[i];
61600
+ var config=item.ColorConfig;
61601
+
61602
+ var color=null;
61603
+ if (config.BGColor) color=config.BGColor;
61604
+ else if (config.Color) color=config.Color;
61605
+
61606
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61607
+
61608
+ var value=item.Data.Value;
61609
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61610
+
61611
+ var value2=item.Data.Value2;
61612
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=ChartData.GetKValue(kItem, item.Data.Value2);
61613
+ aryText.push({ Text:`[${this.FormatValue(value, dataInfo)}, ${this.FormatValue(value2, dataInfo)}] `, Color:color});
61614
+ }
61615
+
61616
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
61617
+
61618
+ return aryText;
61619
+ }
61620
+
61466
61621
  this.FormatVPVRTitle=function(pt, dataInfo)
61467
61622
  {
61468
61623
  var chart=dataInfo.Chart;
@@ -61806,6 +61961,12 @@ function DynamicChartTitlePainting()
61806
61961
  if (!aryText) return null;
61807
61962
  return { Text:null, ArrayText:aryText };
61808
61963
  }
61964
+ else if (item.DataType=="ChartMultiBar")
61965
+ {
61966
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
61967
+ if (!aryText) return null;
61968
+ return { Text:null, ArrayText:aryText };
61969
+ }
61809
61970
 
61810
61971
  value=item.Data.Data[dataIndex];
61811
61972
 
@@ -62231,6 +62392,11 @@ function DynamicChartTitlePainting()
62231
62392
  aryText=this.ForamtMultiPointTitle(dataIndex, item);
62232
62393
  if (!aryText) continue;
62233
62394
  }
62395
+ else if (item.DataType=="ChartMultiBar")
62396
+ {
62397
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
62398
+ if (!aryText) continue;
62399
+ }
62234
62400
  else
62235
62401
  {
62236
62402
  valueText=this.FormatValue(value,item);
@@ -123259,7 +123425,7 @@ function ScriptIndex(name,script,args,option)
123259
123425
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123260
123426
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123261
123427
 
123262
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123428
+ chart.Data=hqChart.GetKData(); //绑定K线
123263
123429
  chart.PointGroup=varItem.Draw.DrawData;
123264
123430
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123265
123431
  chart.BuildCacheData();
@@ -123282,17 +123448,18 @@ function ScriptIndex(name,script,args,option)
123282
123448
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123283
123449
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123284
123450
 
123285
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123451
+ chart.Data=hqChart.GetKData();//绑定K线
123286
123452
  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;
123453
+ chart.BuildCacheData();
123293
123454
 
123294
123455
  this.SetChartIndexName(chart);
123295
123456
  hqChart.ChartPaint.push(chart);
123457
+
123458
+ var titleIndex=windowIndex+1;
123459
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
123460
+ titleData.DataType="ChartMultiBar";
123461
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123462
+ hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123296
123463
  }
123297
123464
 
123298
123465
  this.CreateMultiText=function(hqChart,windowIndex,varItem,i)
@@ -123303,8 +123470,10 @@ function ScriptIndex(name,script,args,option)
123303
123470
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123304
123471
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123305
123472
 
123306
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123473
+ chart.Data=hqChart.GetKData();//绑定K线
123307
123474
  chart.Texts=varItem.Draw.DrawData;
123475
+ chart.BuildCacheData();
123476
+
123308
123477
  this.SetChartIndexName(chart);
123309
123478
  hqChart.ChartPaint.push(chart);
123310
123479
  }
@@ -123317,7 +123486,7 @@ function ScriptIndex(name,script,args,option)
123317
123486
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123318
123487
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123319
123488
 
123320
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123489
+ chart.Data=hqChart.GetKData();//绑定K线
123321
123490
  chart.Family=varItem.Draw.DrawData.Family;
123322
123491
  chart.AryIcon= varItem.Draw.DrawData.Icon;
123323
123492
  chart.BuildCacheData();
@@ -123333,10 +123502,8 @@ function ScriptIndex(name,script,args,option)
123333
123502
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123334
123503
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123335
123504
 
123336
- if (hqChart.ChartPaint[0].IsMinuteFrame())
123337
- chart.Data=hqChart.SourceData;
123338
- else
123339
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123505
+
123506
+ chart.Data=hqChart.GetKData()
123340
123507
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
123341
123508
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
123342
123509
  if (varItem.Draw.BuildKeyCallback) chart.BuildKeyCallback=varItem.Draw.BuildKeyCallback;
@@ -124844,11 +125011,7 @@ function OverlayScriptIndex(name,script,args,option)
124844
125011
  chart.ChartFrame=frame.Frame;
124845
125012
  chart.Identify=overlayIndex.Identify;
124846
125013
 
124847
- if (hqChart.ChartPaint[0].IsMinuteFrame())
124848
- chart.Data=hqChart.SourceData;
124849
- else
124850
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
124851
-
125014
+ chart.Data=hqChart.GetKData();
124852
125015
  chart.Family=varItem.Draw.Icon.Family;
124853
125016
  chart.TextFont=g_JSChartResource.TIPICON.TextFont;
124854
125017
 
@@ -124996,7 +125159,7 @@ function OverlayScriptIndex(name,script,args,option)
124996
125159
  chart.ChartFrame=frame.Frame;
124997
125160
  chart.Identify=overlayIndex.Identify;
124998
125161
 
124999
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125162
+ chart.Data=hqChart.GetKData();//绑定K线
125000
125163
  chart.PointGroup=varItem.Draw.DrawData;
125001
125164
  chart.BuildCacheData();
125002
125165
 
@@ -125046,14 +125209,16 @@ function OverlayScriptIndex(name,script,args,option)
125046
125209
  chart.ChartFrame=frame.Frame;
125047
125210
  chart.Identify=overlayIndex.Identify;
125048
125211
 
125049
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125212
+ chart.Data=hqChart.GetKData();//绑定K线
125050
125213
  chart.Bars=varItem.Draw.DrawData;
125214
+ chart.BuildCacheData();
125051
125215
 
125052
125216
  var titleIndex=windowIndex+1;
125053
125217
  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";
125218
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
125219
+ titleData.DataType="ChartMultiBar";
125220
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
125221
+
125057
125222
  titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
125058
125223
 
125059
125224
  this.SetChartIndexName(chart);
@@ -125071,8 +125236,10 @@ function OverlayScriptIndex(name,script,args,option)
125071
125236
  chart.ChartFrame=frame.Frame;
125072
125237
  chart.Identify=overlayIndex.Identify;
125073
125238
 
125074
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125239
+ chart.Data=hqChart.GetKData();//绑定K线
125075
125240
  chart.Texts=varItem.Draw.DrawData;
125241
+ chart.BuildCacheData();
125242
+
125076
125243
  this.SetChartIndexName(chart);
125077
125244
  frame.ChartPaint.push(chart);
125078
125245
  }
@@ -125088,7 +125255,7 @@ function OverlayScriptIndex(name,script,args,option)
125088
125255
  chart.ChartFrame=frame.Frame;
125089
125256
  chart.Identify=overlayIndex.Identify;
125090
125257
 
125091
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125258
+ chart.Data=hqChart.GetKData();//绑定K线
125092
125259
  chart.Family=varItem.Draw.DrawData.Family;
125093
125260
  chart.AryIcon= varItem.Draw.DrawData.Icon;
125094
125261
  chart.BuildCacheData();
@@ -125106,11 +125273,8 @@ function OverlayScriptIndex(name,script,args,option)
125106
125273
  chart.ChartBorder=frame.Frame.ChartBorder;
125107
125274
  chart.ChartFrame=frame.Frame;
125108
125275
  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线
125276
+ chart.Data=hqChart.GetKData();
125277
+
125114
125278
 
125115
125279
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
125116
125280
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
@@ -126215,7 +126379,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126215
126379
  drawItem.Text=draw.Text;
126216
126380
  drawItem.Name=draw.Name;
126217
126381
  drawItem.DrawType=draw.DrawType;
126218
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126382
+ drawItem.DrawData=draw.DrawData;
126219
126383
  outVarItem.Draw=drawItem;
126220
126384
 
126221
126385
  result.push(outVarItem);
@@ -126266,8 +126430,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126266
126430
  drawItem.Text=draw.Text;
126267
126431
  drawItem.Name=draw.Name;
126268
126432
  drawItem.DrawType=draw.DrawType;
126269
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126270
- this.GetKLineData(drawItem.DrawData, hqChart);
126433
+ drawItem.DrawData=draw.DrawData;
126271
126434
  outVarItem.Draw=drawItem;
126272
126435
  result.push(outVarItem);
126273
126436
  }
@@ -126762,8 +126925,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126762
126925
  drawItem.Text=draw.Text;
126763
126926
  drawItem.Name=draw.Name;
126764
126927
  drawItem.DrawType=draw.DrawType;
126765
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126766
- this.GetKLineData(drawItem.DrawData, hqChart);
126928
+ drawItem.DrawData=draw.DrawData;
126767
126929
  outVarItem.Draw=drawItem;
126768
126930
  result.push(outVarItem);
126769
126931
  }
@@ -152212,7 +152374,7 @@ function HQChartScriptWorker()
152212
152374
 
152213
152375
 
152214
152376
 
152215
- var HQCHART_VERSION="1.1.14339";
152377
+ var HQCHART_VERSION="1.1.14353";
152216
152378
 
152217
152379
  function PrintHQChartVersion()
152218
152380
  {