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.
@@ -28399,6 +28399,12 @@ function IChartPainting()
28399
28399
 
28400
28400
  }
28401
28401
 
28402
+ this.BuildKey=function(item)
28403
+ {
28404
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
28405
+ else return item.Date;
28406
+ }
28407
+
28402
28408
  //数据导出 数据格式 [{ Title:数据名称, Data:[] }]
28403
28409
  //this.ExportData=function(aryKData) { }
28404
28410
 
@@ -44336,159 +44342,285 @@ function ChartMultiBar()
44336
44342
  delete this.newMethod;
44337
44343
 
44338
44344
  this.ClassName="ChartMultiBar";
44339
- this.Bars=[]; // [ {Point:[ {Index, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
44345
+ this.Bars=[]; // [ {Point:[ {Date, Time, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
44340
44346
  this.IsHScreen=false;
44341
44347
 
44348
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44349
+ this.GetKValue=ChartData.GetKValue;
44350
+
44351
+ this.GetItem=function(kItem)
44352
+ {
44353
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44354
+
44355
+ var key=this.BuildKey(kItem);
44356
+ if (!this.MapCache.has(key)) return null;
44357
+
44358
+ return this.MapCache.get(key);
44359
+ }
44360
+
44361
+ this.BuildCacheData=function()
44362
+ {
44363
+ var mapData=new Map();
44364
+ this.MapCache=mapData;
44365
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Bars)) return;
44366
+
44367
+ for(var i=0; i<this.Bars.length; ++i)
44368
+ {
44369
+ var groupItem=this.Bars[i];
44370
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44371
+
44372
+ var clrConfig= { Color:groupItem.Color, Width:5, Name:groupItem.Name, Type:0 };
44373
+ if (IFrameSplitOperator.IsNumber(groupItem.Width)) clrConfig.Width=groupItem.Width;
44374
+ if (IFrameSplitOperator.IsNumber(groupItem.Type)) clrConfig.Type=groupItem.Type;
44375
+
44376
+ for(var j=0; j<groupItem.Point.length; ++j)
44377
+ {
44378
+ var point=groupItem.Point[j];
44379
+ var key=this.BuildKey(point);
44380
+
44381
+ var item={ Data:point, ColorConfig:clrConfig }
44382
+ if (mapData.has(key))
44383
+ {
44384
+ var mapItem=mapData.get(key);
44385
+ mapItem.Data.push(item);
44386
+ }
44387
+ else
44388
+ {
44389
+ mapData.set(key,{ Data:[item] });
44390
+ }
44391
+ }
44392
+ }
44393
+ }
44394
+
44342
44395
  this.Draw=function()
44343
44396
  {
44344
44397
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44345
44398
  if (this.IsShowIndexTitleOnly()) return;
44346
44399
  if (this.IsHideScriptIndex()) return;
44347
- if (!this.Data || this.Data.length<=0) return;
44400
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44401
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Bars)) return;
44402
+ if (!this.MapCache || this.MapCache.size<=0) return;
44348
44403
 
44349
44404
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44350
44405
  var xPointCount=this.ChartFrame.XPointCount;
44351
- var offset=this.Data.DataOffset;
44352
44406
  var dataWidth=this.ChartFrame.DataWidth;
44353
- var pixelRatio=GetDevicePixelRatio();
44407
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44408
+ var isMinute=this.IsMinuteFrame();
44354
44409
 
44355
- var drawBars=[];
44356
- for(var i in this.Bars)
44410
+ var border=this.GetBorder();
44411
+ if (this.IsHScreen)
44357
44412
  {
44358
- var item=this.Bars[i];
44359
- var drawPoints={ Point:[], Color:item.Color, Width:dataWidth, Type:0 };
44360
- if (item.Type>0) drawPoints.Type=item.Type;
44361
- if (item.Width>0)
44362
- {
44363
- drawPoints.Width=item.Width*pixelRatio;
44364
- if (drawPoints.Width>dataWidth) drawPoints.Width=dataWidth;
44365
- }
44366
- else
44367
- {
44368
- if(drawPoints.Width<4) drawPoints.Width=1*pixelRatio;
44369
- }
44370
-
44371
- for(var j in item.Point)
44372
- {
44373
- var point=item.Point[j];
44374
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
44375
-
44376
- var index=point.Index-offset;
44377
- if (index>=0 && index<xPointCount)
44378
- {
44379
- var x=this.ChartFrame.GetXFromIndex(index);
44380
- var y=this.ChartFrame.GetYFromData(point.Value);
44381
- var y2=this.ChartFrame.GetYFromData(point.Value2);
44382
- drawPoints.Point.push({X:x, Y:y, Y2:y2});
44383
- }
44384
- }
44385
-
44386
- if (drawPoints.Point.length>0) drawBars.push(drawPoints)
44413
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44414
+ var chartright=border.BottomEx;
44415
+ var chartLeft=border.TopEx;
44387
44416
  }
44388
-
44389
- for(var i in drawBars)
44417
+ else
44390
44418
  {
44391
- var item=drawBars[i];
44392
- if (item.Width>=4)
44393
- {
44394
- if (item.Type==1) this.DrawHollowBar(item);
44395
- else this.DrawFillBar(item);
44396
- }
44397
- else
44398
- {
44399
- this.DrawLineBar(item);
44400
- }
44419
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44420
+ var chartright=border.RightEx;
44421
+ var chartLeft=border.LeftEx;
44401
44422
  }
44402
- }
44403
44423
 
44404
- this.DrawLineBar=function(bar)
44405
- {
44406
- this.Canvas.strokeStyle=bar.Color;
44407
- var backupLineWidth=this.Canvas.lineWidth;
44408
- this.Canvas.lineWidth=bar.Width;
44409
- for(var i in bar.Point)
44424
+ //计算所有柱子位置
44425
+ var mapBar=new Map();
44426
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44410
44427
  {
44411
- var item=bar.Point[i];
44428
+ var kItem=this.Data.Data[i];
44429
+ var key=this.BuildKey(kItem);
44430
+ if (!this.MapCache.has(key)) continue;
44431
+ var mapItem=this.MapCache.get(key);
44432
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44412
44433
 
44413
- this.Canvas.beginPath();
44414
- if (this.IsHScreen)
44434
+ if (isMinute)
44415
44435
  {
44416
- this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));
44417
- this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));
44436
+ var x=this.ChartFrame.GetXFromIndex(j);
44418
44437
  }
44419
44438
  else
44420
44439
  {
44421
- this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));
44422
- this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));
44440
+ var left=xOffset;
44441
+ var right=xOffset+dataWidth;
44442
+ if (right>chartright) break;
44443
+ var x=left+(right-left)/2;
44423
44444
  }
44424
-
44425
- this.Canvas.stroke();
44445
+
44446
+ this.CalculateItem(mapItem, kItem, x, mapBar);
44426
44447
  }
44427
44448
 
44428
- this.Canvas.lineWidth=backupLineWidth;
44449
+ if (mapBar.size<=0) return;
44450
+
44451
+ this.Canvas.save();
44452
+ this.ClipClient(this.IsHScreen);
44453
+
44454
+ this.DrawAllBar(mapBar);
44455
+
44456
+ this.Canvas.restore();
44429
44457
  }
44430
44458
 
44431
- this.DrawFillBar=function(bar)
44459
+ this.CalculateItem=function(groupItem, kItem, x, mapBar)
44432
44460
  {
44433
- this.Canvas.fillStyle=bar.Color;
44434
- for(var i in bar.Point)
44461
+ for(var i=0; i<groupItem.Data.length; ++i)
44435
44462
  {
44436
- var item=bar.Point[i];
44437
- var x=item.X-(bar.Width/2);
44438
- var y=Math.min(item.Y,item.Y2);
44439
- var barWidth=bar.Width;
44440
- var barHeight=Math.abs(item.Y-item.Y2);
44441
- if (this.IsHScreen)
44442
- this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth));
44443
- else
44444
- this.Canvas.fillRect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight));
44463
+ var item=groupItem.Data[i];
44464
+ var value=item.Data.Value;
44465
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44466
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44467
+
44468
+ var value2=item.Data.Value2;
44469
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=this.GetKValue(kItem,item.Data.Value2);
44470
+ if (!IFrameSplitOperator.IsNumber(value2)) continue;
44471
+
44472
+ var y=this.ChartFrame.GetYFromData(value, false);
44473
+ var y2=this.ChartFrame.GetYFromData(value2, false);
44474
+
44475
+ var strConfig=JSON.stringify(item.ColorConfig);
44476
+ if (!mapBar.has(strConfig)) mapBar.set(strConfig, { AryBar:[]});
44477
+ var mapItem=mapBar.get(strConfig);
44478
+
44479
+ mapItem.AryBar.push({ X:x, Y:y, Y2:y2, Data:item });
44445
44480
  }
44446
44481
  }
44447
44482
 
44448
- this.DrawHollowBar=function(bar) //空心柱子
44483
+
44484
+ this.DrawAllBar=function(mapBar)
44449
44485
  {
44450
- this.Canvas.strokeStyle=bar.Color;
44451
- var backupLineWidth=1;
44452
- for(var i in bar.Point)
44486
+ var pixelRatio=GetDevicePixelRatio();
44487
+
44488
+ for(var mapItem of mapBar)
44453
44489
  {
44454
- var item=bar.Point[i];
44455
- var x=item.X-(bar.Width/2);
44456
- var y=Math.min(item.Y,item.Y2);
44457
- var barWidth=bar.Width;
44458
- var barHeight=Math.abs(item.Y-item.Y2);
44490
+ var aryBar=mapItem[1].AryBar;
44491
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryBar)) continue;
44492
+
44493
+ var config=null;
44494
+ var path=new Path2D();
44495
+ var count=0;
44496
+ var drawType=-1; //1=直线 2=实心 3=空心
44497
+ var barWidth=1;
44459
44498
  this.Canvas.beginPath();
44460
- if (this.IsHScreen)
44461
- this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedRect(barHeight),ToFixedRect(barWidth));
44462
- else
44463
- this.Canvas.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedRect(barWidth),ToFixedRect(barHeight));
44499
+ for(var i=0;i<aryBar.length;++i)
44500
+ {
44501
+ var item=aryBar[i];
44502
+ if (!config)
44503
+ {
44504
+ config=item.Data.ColorConfig;
44505
+ barWidth=config.Width*pixelRatio;
44506
+ if (barWidth>4)
44507
+ {
44508
+ if (config.Type==0) drawType=2; //实心
44509
+ else if (config.Type==1) drawType=3; //空心
44510
+ else continue;
44511
+ }
44512
+ else //太细了, 直线
44513
+ {
44514
+ drawType=1;
44515
+ }
44516
+ }
44464
44517
 
44465
- this.Canvas.stroke();
44466
- }
44518
+ if (drawType<=0) continue;
44467
44519
 
44468
- this.Canvas.lineWidth=backupLineWidth;
44520
+ if (drawType==1)
44521
+ {
44522
+ if (this.IsHScreen)
44523
+ {
44524
+ this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));
44525
+ this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));
44526
+ }
44527
+ else
44528
+ {
44529
+ this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));
44530
+ this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));
44531
+ }
44532
+ ++count;
44533
+ }
44534
+ else if (drawType==2) //实心
44535
+ {
44536
+ var x=item.X-(barWidth/2);
44537
+ var y=Math.min(item.Y,item.Y2);
44538
+ var barWidth=barWidth;
44539
+ var barHeight=Math.abs(item.Y-item.Y2);
44540
+
44541
+ var barPath = new Path2D();
44542
+ if (this.IsHScreen)
44543
+ barPath.rect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth))
44544
+ else
44545
+ barPath.rect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight))
44546
+
44547
+ path.addPath(barPath);
44548
+ ++count;
44549
+ }
44550
+ else if (drawType==3) //空心
44551
+ {
44552
+ var x=item.X-(barWidth/2);
44553
+ var y=Math.min(item.Y,item.Y2);
44554
+ var barWidth=barWidth;
44555
+ var barHeight=Math.abs(item.Y-item.Y2);
44556
+
44557
+ var barPath = new Path2D();
44558
+ if (this.IsHScreen)
44559
+ barPath.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedPoint(barHeight),ToFixedPoint(barWidth))
44560
+ else
44561
+ barPath.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedPoint(barWidth),ToFixedPoint(barHeight))
44562
+
44563
+ path.addPath(barPath);
44564
+ ++count;
44565
+ }
44566
+ }
44567
+
44568
+
44569
+ if (count>0 && drawType>0 && config)
44570
+ {
44571
+ if (drawType==1)
44572
+ {
44573
+ this.Canvas.lineWidth=1*pixelRatio;
44574
+ this.Canvas.strokeStyle=config.Color;
44575
+ this.Canvas.stroke();
44576
+ }
44577
+ else if (drawType==2)
44578
+ {
44579
+ this.Canvas.fillStyle=config.Color; //背景填充颜色
44580
+ this.Canvas.fill(path);
44581
+ }
44582
+ else if (drawType==3)
44583
+ {
44584
+ this.Canvas.lineWidth=1*pixelRatio;
44585
+ this.Canvas.strokeStyle=config.Color;
44586
+ this.Canvas.stroke(path);
44587
+ }
44588
+ }
44589
+
44590
+ }
44469
44591
  }
44470
44592
 
44471
44593
  this.GetMaxMin=function()
44472
44594
  {
44473
44595
  var range={ Min:null, Max:null };
44596
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
44597
+ if (!this.MapCache || this.MapCache.size<=0) return range;
44474
44598
  var xPointCount=this.ChartFrame.XPointCount;
44475
- var start=this.Data.DataOffset;
44476
- var end=start+xPointCount;
44477
- for(var i in this.Bars)
44599
+
44600
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44478
44601
  {
44479
- var item=this.Bars[i];
44480
- for(var j in item.Point)
44602
+ var kItem=this.Data.Data[i];
44603
+ var key=this.BuildKey(kItem);
44604
+ if (!this.MapCache.has(key)) continue;
44605
+ var mapItem=this.MapCache.get(key);
44606
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44607
+
44608
+ for(k=0;k<mapItem.Data.length;++k)
44481
44609
  {
44482
- var point=item.Point[j];
44483
- if (point.Index>=start && point.Index<end)
44484
- {
44485
- var minValue=Math.min(point.Value,point.Value2);
44486
- var maxValue=Math.max(point.Value,point.Value2);
44487
- if (range.Max==null) range.Max=maxValue;
44488
- else if (range.Max<maxValue) range.Max=maxValue;
44489
- if (range.Min==null) range.Min=minValue;
44490
- else if (range.Min>minValue) range.Min=minValue;
44491
- }
44610
+ var item=mapItem.Data[k];
44611
+ var value=item.Data.Value;
44612
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44613
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44614
+ var value2=item.Data.Value2;
44615
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=this.GetKValue(kItem,item.Data.Value2);
44616
+ if (!IFrameSplitOperator.IsNumber(value2)) continue;
44617
+
44618
+ var minValue=Math.min(value, value2);
44619
+ var maxValue=Math.max(value, value2);
44620
+ if (range.Max==null) range.Max=maxValue;
44621
+ else if (range.Max<maxValue) range.Max=maxValue;
44622
+ if (range.Min==null) range.Min=minValue;
44623
+ else if (range.Min>minValue) range.Min=minValue;
44492
44624
  }
44493
44625
  }
44494
44626
 
@@ -44830,7 +44962,7 @@ function ChartMultiLine()
44830
44962
  }
44831
44963
  }
44832
44964
 
44833
- // 多个点集合 支持横屏
44965
+ // 多个点集合2.0 支持横屏
44834
44966
  function ChartMultiPoint()
44835
44967
  {
44836
44968
  this.newMethod=IChartPainting; //派生
@@ -44848,12 +44980,6 @@ function ChartMultiPoint()
44848
44980
  this.MapCache=null; //key=date/date-time value={ Data:[] }
44849
44981
  this.GetKValue=ChartData.GetKValue;
44850
44982
 
44851
- this.BuildKey=function(item)
44852
- {
44853
- if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44854
- else return item.Date;
44855
- }
44856
-
44857
44983
  this.GetItem=function(kItem)
44858
44984
  {
44859
44985
  if (!this.MapCache || this.MapCache.size<=0) return null;
@@ -44877,6 +45003,7 @@ function ChartMultiPoint()
44877
45003
 
44878
45004
  var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44879
45005
  if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
45006
+ if (IFrameSplitOperator.IsNumber(groupItem.LineWidth)) clrConfig.LineWidth=groupItem.LineWidth;
44880
45007
 
44881
45008
  for(var j=0; j<groupItem.Point.length; ++j)
44882
45009
  {
@@ -45029,7 +45156,7 @@ function ChartMultiPoint()
45029
45156
  {
45030
45157
  var range={ Min:null, Max:null };
45031
45158
  if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45032
- if (!this.MapCache || this.MapCache.size<=0) return;
45159
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45033
45160
  var xPointCount=this.ChartFrame.XPointCount;
45034
45161
 
45035
45162
  for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
@@ -45058,7 +45185,7 @@ function ChartMultiPoint()
45058
45185
  }
45059
45186
  }
45060
45187
 
45061
- // 多文本集合 支持横屏
45188
+ // 多文本集合2.0 支持横屏
45062
45189
  function ChartMultiText()
45063
45190
  {
45064
45191
  this.newMethod=IChartPainting; //派生
@@ -45066,58 +45193,38 @@ function ChartMultiText()
45066
45193
  delete this.newMethod;
45067
45194
 
45068
45195
  this.ClassName="ChartMultiText";
45069
- this.Texts=[]; //[ {Index:, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 }} ]
45196
+ this.Texts=[]; //[ {Date:, Time, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 }} ]
45070
45197
  this.Font=g_JSChartResource.DefaultTextFont;
45071
45198
  this.Color=g_JSChartResource.DefaultTextColor;
45072
45199
  this.IsHScreen=false; //是否横屏
45073
45200
 
45074
- this.BuildKey=function(item)
45075
- {
45076
- if (IFrameSplitOperator.IsNumber(item.Time))
45077
- {
45078
- var key=`${item.Date}-${item.Time}`;
45079
- }
45080
- else
45081
- {
45082
- var key=`${item.Date}`;
45083
- }
45084
-
45085
- return key;
45086
- }
45201
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
45202
+ this.GetKValue=ChartData.GetKValue;
45087
45203
 
45088
- this.GetShowTextData=function()
45204
+ this.BuildCacheData=function()
45089
45205
  {
45090
- var xPointCount=this.ChartFrame.XPointCount;
45091
- var offset=this.Data.DataOffset;
45206
+ var mapData=new Map();
45207
+ this.MapCache=mapData;
45208
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45092
45209
 
45093
- var mapText=new Map(); //key='date-time' value={ Data:[] }
45094
- for(var i=0; i<this.Texts.length; ++i)
45210
+ for(var i=0;i<this.Texts.length;++i)
45095
45211
  {
45096
45212
  var item=this.Texts[i];
45097
- if (!item.Text) continue;
45098
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
45099
-
45100
- var index=item.Index-offset;
45101
- if (index>=0 && index<xPointCount)
45213
+ var key=this.BuildKey(item);
45214
+ if (mapData.has(key))
45102
45215
  {
45103
- var key=this.BuildKey(item);
45104
- if (mapText.has(key))
45105
- {
45106
- var textItem=mapText.get(key);
45107
- textItem.Data.push(item);
45108
- }
45109
- else
45110
- {
45111
- var textItem={ Data:[item] };
45112
- mapText.set(key, textItem);
45113
- }
45216
+ var mapItem=mapData.get(key);
45217
+ mapItem.Data.push(item);
45218
+ }
45219
+ else
45220
+ {
45221
+ mapData.set(key,{ Data:[item] });
45114
45222
  }
45115
45223
  }
45116
-
45117
- return mapText;
45118
45224
  }
45119
45225
 
45120
- this.DrawAllText=function(mapText)
45226
+
45227
+ this.DrawAllText=function()
45121
45228
  {
45122
45229
  var bHScreen=(this.ChartFrame.IsHScreen===true);
45123
45230
  var isMinute=this.IsMinuteFrame();
@@ -45154,21 +45261,29 @@ function ChartMultiText()
45154
45261
  if (!kItem) continue;
45155
45262
 
45156
45263
  var key=this.BuildKey(kItem);
45157
- if (!mapText.has(key)) continue;
45264
+ if (!this.MapCache.has(key)) continue;
45265
+ var mapItem=this.MapCache.get(key);
45266
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45158
45267
 
45159
45268
  var left=xOffset;
45160
45269
  var right=xOffset+dataWidth;
45161
45270
  if (right>chartright) break;
45162
45271
  var x=left+(right-left)/2;
45163
45272
 
45164
- var textItem=mapText.get(key);
45165
- for(var k=0;k<textItem.Data.length;++k)
45273
+ for(var k=0;k<mapItem.Data.length;++k)
45166
45274
  {
45167
- var item=textItem.Data[k];
45275
+ var item=mapItem.Data[k];
45168
45276
  var y=top;
45169
45277
  if (item.Value=="TOP") y=top;
45170
45278
  else if (item.Value=="BOTTOM") y=bottom;
45171
- else y=this.ChartFrame.GetYFromData(item.Value, false);
45279
+ else
45280
+ {
45281
+ var price=item.Value;
45282
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
45283
+
45284
+ y=this.ChartFrame.GetYFromData(price, false);
45285
+ }
45286
+
45172
45287
 
45173
45288
  if (item.Color) this.Canvas.fillStyle = item.Color;
45174
45289
  else this.Canvas.fillStyle = this.Color;
@@ -45208,7 +45323,6 @@ function ChartMultiText()
45208
45323
 
45209
45324
  if (item.Line)
45210
45325
  {
45211
- var kItem=this.Data.Data[item.Index];
45212
45326
  var price=item.Line.KData=="H"? kItem.High:kItem.Low;
45213
45327
  var yPrice=this.ChartFrame.GetYFromData(price, false);
45214
45328
  var yText=y;
@@ -45253,18 +45367,16 @@ function ChartMultiText()
45253
45367
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
45254
45368
  if (this.IsShowIndexTitleOnly()) return;
45255
45369
  if (this.IsHideScriptIndex()) return;
45256
- if (!this.Data || this.Data.length<=0) return;
45257
- if (!this.Texts) return;
45370
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
45371
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45372
+ if (!this.MapCache || this.MapCache.size<=0) return;
45258
45373
 
45259
45374
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45260
45375
 
45261
- var mapText=this.GetShowTextData();
45262
- if (mapText.size<=0) return;
45263
-
45264
45376
  this.Canvas.save();
45265
45377
  this.ClipClient(this.IsHScreen);
45266
45378
 
45267
- this.DrawAllText(mapText);
45379
+ this.DrawAllText();
45268
45380
 
45269
45381
  this.Canvas.restore();
45270
45382
  }
@@ -45274,21 +45386,29 @@ function ChartMultiText()
45274
45386
  var range={ Min:null, Max:null };
45275
45387
  if (!this.Texts) return range;
45276
45388
 
45389
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45390
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45277
45391
  var xPointCount=this.ChartFrame.XPointCount;
45278
- var start=this.Data.DataOffset;
45279
- var end=start+xPointCount;
45280
45392
 
45281
- for(var i in this.Texts)
45393
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45282
45394
  {
45283
- var item=this.Texts[i];
45284
- if (!IFrameSplitOperator.IsNumber(item.Value)) continue;
45395
+ var kItem=this.Data.Data[i];
45396
+ var key=this.BuildKey(kItem);
45397
+ if (!this.MapCache.has(key)) continue;
45398
+ var mapItem=this.MapCache.get(key);
45399
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45285
45400
 
45286
- if (item.Index>=start && item.Index<end)
45401
+ for(k=0;k<mapItem.Data.length;++k)
45287
45402
  {
45288
- if (range.Max==null) range.Max=item.Value;
45289
- else if (range.Max<item.Value) range.Max=item.Value;
45290
- if (range.Min==null) range.Min=item.Value;
45291
- else if (range.Min>item.Value) range.Min=item.Value;
45403
+ var item=mapItem.Data[k];
45404
+ var value=item.Value;
45405
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
45406
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45407
+
45408
+ if (range.Max==null) range.Max=value;
45409
+ else if (range.Max<value) range.Max=value;
45410
+ if (range.Min==null) range.Min=value;
45411
+ else if (range.Min>value) range.Min=value;
45292
45412
  }
45293
45413
  }
45294
45414
 
@@ -45805,7 +45925,7 @@ function ChartMultiHtmlDom()
45805
45925
  }
45806
45926
  }
45807
45927
 
45808
- //绘制SVG图标
45928
+ //绘制SVG图标 2.0
45809
45929
  function ChartDrawSVG()
45810
45930
  {
45811
45931
  this.newMethod=IChartPainting; //派生
@@ -61419,6 +61539,41 @@ function DynamicChartTitlePainting()
61419
61539
  return aryText;
61420
61540
  }
61421
61541
 
61542
+ this.ForamtMultiBarTitle=function(dataIndex, dataInfo)
61543
+ {
61544
+ if (!dataInfo.GetItemCallback) return null;
61545
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61546
+ var kItem=dataInfo.Data.Data[dataIndex];
61547
+ if (!kItem) return null;
61548
+
61549
+ var group=dataInfo.GetItemCallback(kItem);
61550
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61551
+
61552
+ var aryText=[];
61553
+ for(var i=0;i<group.Data.length;++i)
61554
+ {
61555
+ var item=group.Data[i];
61556
+ var config=item.ColorConfig;
61557
+
61558
+ var color=null;
61559
+ if (config.BGColor) color=config.BGColor;
61560
+ else if (config.Color) color=config.Color;
61561
+
61562
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61563
+
61564
+ var value=item.Data.Value;
61565
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61566
+
61567
+ var value2=item.Data.Value2;
61568
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=ChartData.GetKValue(kItem, item.Data.Value2);
61569
+ aryText.push({ Text:`[${this.FormatValue(value, dataInfo)}, ${this.FormatValue(value2, dataInfo)}] `, Color:color});
61570
+ }
61571
+
61572
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
61573
+
61574
+ return aryText;
61575
+ }
61576
+
61422
61577
  this.FormatVPVRTitle=function(pt, dataInfo)
61423
61578
  {
61424
61579
  var chart=dataInfo.Chart;
@@ -61762,6 +61917,12 @@ function DynamicChartTitlePainting()
61762
61917
  if (!aryText) return null;
61763
61918
  return { Text:null, ArrayText:aryText };
61764
61919
  }
61920
+ else if (item.DataType=="ChartMultiBar")
61921
+ {
61922
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
61923
+ if (!aryText) return null;
61924
+ return { Text:null, ArrayText:aryText };
61925
+ }
61765
61926
 
61766
61927
  value=item.Data.Data[dataIndex];
61767
61928
 
@@ -62187,6 +62348,11 @@ function DynamicChartTitlePainting()
62187
62348
  aryText=this.ForamtMultiPointTitle(dataIndex, item);
62188
62349
  if (!aryText) continue;
62189
62350
  }
62351
+ else if (item.DataType=="ChartMultiBar")
62352
+ {
62353
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
62354
+ if (!aryText) continue;
62355
+ }
62190
62356
  else
62191
62357
  {
62192
62358
  valueText=this.FormatValue(value,item);
@@ -123215,7 +123381,7 @@ function ScriptIndex(name,script,args,option)
123215
123381
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123216
123382
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123217
123383
 
123218
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123384
+ chart.Data=hqChart.GetKData(); //绑定K线
123219
123385
  chart.PointGroup=varItem.Draw.DrawData;
123220
123386
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123221
123387
  chart.BuildCacheData();
@@ -123238,17 +123404,18 @@ function ScriptIndex(name,script,args,option)
123238
123404
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123239
123405
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123240
123406
 
123241
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123407
+ chart.Data=hqChart.GetKData();//绑定K线
123242
123408
  chart.Bars=varItem.Draw.DrawData;
123243
-
123244
- var titleIndex=windowIndex+1;
123245
- var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
123246
- titleData.IsShow=false;
123247
- titleData.DataType="MULTI_BAR";
123248
- hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123409
+ chart.BuildCacheData();
123249
123410
 
123250
123411
  this.SetChartIndexName(chart);
123251
123412
  hqChart.ChartPaint.push(chart);
123413
+
123414
+ var titleIndex=windowIndex+1;
123415
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
123416
+ titleData.DataType="ChartMultiBar";
123417
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123418
+ hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123252
123419
  }
123253
123420
 
123254
123421
  this.CreateMultiText=function(hqChart,windowIndex,varItem,i)
@@ -123259,8 +123426,10 @@ 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.Texts=varItem.Draw.DrawData;
123431
+ chart.BuildCacheData();
123432
+
123264
123433
  this.SetChartIndexName(chart);
123265
123434
  hqChart.ChartPaint.push(chart);
123266
123435
  }
@@ -123273,7 +123442,7 @@ function ScriptIndex(name,script,args,option)
123273
123442
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123274
123443
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123275
123444
 
123276
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123445
+ chart.Data=hqChart.GetKData();//绑定K线
123277
123446
  chart.Family=varItem.Draw.DrawData.Family;
123278
123447
  chart.AryIcon= varItem.Draw.DrawData.Icon;
123279
123448
  chart.BuildCacheData();
@@ -123289,10 +123458,8 @@ function ScriptIndex(name,script,args,option)
123289
123458
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123290
123459
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123291
123460
 
123292
- if (hqChart.ChartPaint[0].IsMinuteFrame())
123293
- chart.Data=hqChart.SourceData;
123294
- else
123295
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123461
+
123462
+ chart.Data=hqChart.GetKData()
123296
123463
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
123297
123464
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
123298
123465
  if (varItem.Draw.BuildKeyCallback) chart.BuildKeyCallback=varItem.Draw.BuildKeyCallback;
@@ -124800,11 +124967,7 @@ function OverlayScriptIndex(name,script,args,option)
124800
124967
  chart.ChartFrame=frame.Frame;
124801
124968
  chart.Identify=overlayIndex.Identify;
124802
124969
 
124803
- if (hqChart.ChartPaint[0].IsMinuteFrame())
124804
- chart.Data=hqChart.SourceData;
124805
- else
124806
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
124807
-
124970
+ chart.Data=hqChart.GetKData();
124808
124971
  chart.Family=varItem.Draw.Icon.Family;
124809
124972
  chart.TextFont=g_JSChartResource.TIPICON.TextFont;
124810
124973
 
@@ -124952,7 +125115,7 @@ function OverlayScriptIndex(name,script,args,option)
124952
125115
  chart.ChartFrame=frame.Frame;
124953
125116
  chart.Identify=overlayIndex.Identify;
124954
125117
 
124955
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125118
+ chart.Data=hqChart.GetKData();//绑定K线
124956
125119
  chart.PointGroup=varItem.Draw.DrawData;
124957
125120
  chart.BuildCacheData();
124958
125121
 
@@ -125002,14 +125165,16 @@ function OverlayScriptIndex(name,script,args,option)
125002
125165
  chart.ChartFrame=frame.Frame;
125003
125166
  chart.Identify=overlayIndex.Identify;
125004
125167
 
125005
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125168
+ chart.Data=hqChart.GetKData();//绑定K线
125006
125169
  chart.Bars=varItem.Draw.DrawData;
125170
+ chart.BuildCacheData();
125007
125171
 
125008
125172
  var titleIndex=windowIndex+1;
125009
125173
  var titlePaint=hqChart.TitlePaint[titleIndex];
125010
- var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
125011
- titleData.IsShow=false;
125012
- titleData.DataType="MULTI_BAR";
125174
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
125175
+ titleData.DataType="ChartMultiBar";
125176
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
125177
+
125013
125178
  titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
125014
125179
 
125015
125180
  this.SetChartIndexName(chart);
@@ -125027,8 +125192,10 @@ function OverlayScriptIndex(name,script,args,option)
125027
125192
  chart.ChartFrame=frame.Frame;
125028
125193
  chart.Identify=overlayIndex.Identify;
125029
125194
 
125030
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125195
+ chart.Data=hqChart.GetKData();//绑定K线
125031
125196
  chart.Texts=varItem.Draw.DrawData;
125197
+ chart.BuildCacheData();
125198
+
125032
125199
  this.SetChartIndexName(chart);
125033
125200
  frame.ChartPaint.push(chart);
125034
125201
  }
@@ -125044,7 +125211,7 @@ function OverlayScriptIndex(name,script,args,option)
125044
125211
  chart.ChartFrame=frame.Frame;
125045
125212
  chart.Identify=overlayIndex.Identify;
125046
125213
 
125047
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125214
+ chart.Data=hqChart.GetKData();//绑定K线
125048
125215
  chart.Family=varItem.Draw.DrawData.Family;
125049
125216
  chart.AryIcon= varItem.Draw.DrawData.Icon;
125050
125217
  chart.BuildCacheData();
@@ -125062,11 +125229,8 @@ function OverlayScriptIndex(name,script,args,option)
125062
125229
  chart.ChartBorder=frame.Frame.ChartBorder;
125063
125230
  chart.ChartFrame=frame.Frame;
125064
125231
  chart.Identify=overlayIndex.Identify;
125065
-
125066
- if (hqChart.ChartPaint[0].IsMinuteFrame())
125067
- chart.Data=hqChart.SourceData;
125068
- else
125069
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125232
+ chart.Data=hqChart.GetKData();
125233
+
125070
125234
 
125071
125235
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
125072
125236
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
@@ -126171,7 +126335,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126171
126335
  drawItem.Text=draw.Text;
126172
126336
  drawItem.Name=draw.Name;
126173
126337
  drawItem.DrawType=draw.DrawType;
126174
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126338
+ drawItem.DrawData=draw.DrawData;
126175
126339
  outVarItem.Draw=drawItem;
126176
126340
 
126177
126341
  result.push(outVarItem);
@@ -126222,8 +126386,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126222
126386
  drawItem.Text=draw.Text;
126223
126387
  drawItem.Name=draw.Name;
126224
126388
  drawItem.DrawType=draw.DrawType;
126225
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126226
- this.GetKLineData(drawItem.DrawData, hqChart);
126389
+ drawItem.DrawData=draw.DrawData;
126227
126390
  outVarItem.Draw=drawItem;
126228
126391
  result.push(outVarItem);
126229
126392
  }
@@ -126718,8 +126881,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126718
126881
  drawItem.Text=draw.Text;
126719
126882
  drawItem.Name=draw.Name;
126720
126883
  drawItem.DrawType=draw.DrawType;
126721
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126722
- this.GetKLineData(drawItem.DrawData, hqChart);
126884
+ drawItem.DrawData=draw.DrawData;
126723
126885
  outVarItem.Draw=drawItem;
126724
126886
  result.push(outVarItem);
126725
126887
  }
@@ -142564,7 +142726,7 @@ function ScrollBarBGChart()
142564
142726
 
142565
142727
 
142566
142728
 
142567
- var HQCHART_VERSION="1.1.14339";
142729
+ var HQCHART_VERSION="1.1.14353";
142568
142730
 
142569
142731
  function PrintHQChartVersion()
142570
142732
  {