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.
@@ -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);
44459
- 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));
44490
+ aryBar=mapItem[1].AryBar;
44491
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryBar)) continue;
44464
44492
 
44465
- this.Canvas.stroke();
44466
- }
44493
+ var config=null;
44494
+ var path=new Path2D();
44495
+ var count=0;
44496
+ var drawType=-1; //1=直线 2=实心 3=空心
44497
+ var barWidth=1;
44498
+ for(var i=0;i<aryBar.length;++i)
44499
+ {
44500
+ var item=aryBar[i];
44501
+ if (!config)
44502
+ {
44503
+ config=item.Data.ColorConfig;
44504
+ barWidth=config.Width*pixelRatio;
44505
+ if (barWidth>4)
44506
+ {
44507
+ if (config.Type==0) drawType=2; //实心
44508
+ else if (config.Type==1) drawType=3; //空心
44509
+ else continue;
44510
+ }
44511
+ else //太细了, 直线
44512
+ {
44513
+ drawType=1;
44514
+ }
44515
+ }
44467
44516
 
44468
- this.Canvas.lineWidth=backupLineWidth;
44517
+ if (drawType<=0) continue;
44518
+
44519
+ if (drawType==1)
44520
+ {
44521
+ this.Canvas.beginPath();
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;
@@ -45253,18 +45368,16 @@ function ChartMultiText()
45253
45368
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
45254
45369
  if (this.IsShowIndexTitleOnly()) return;
45255
45370
  if (this.IsHideScriptIndex()) return;
45256
- if (!this.Data || this.Data.length<=0) return;
45257
- if (!this.Texts) return;
45371
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
45372
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45373
+ if (!this.MapCache || this.MapCache.size<=0) return;
45258
45374
 
45259
45375
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45260
45376
 
45261
- var mapText=this.GetShowTextData();
45262
- if (mapText.size<=0) return;
45263
-
45264
45377
  this.Canvas.save();
45265
45378
  this.ClipClient(this.IsHScreen);
45266
45379
 
45267
- this.DrawAllText(mapText);
45380
+ this.DrawAllText();
45268
45381
 
45269
45382
  this.Canvas.restore();
45270
45383
  }
@@ -45274,21 +45387,29 @@ function ChartMultiText()
45274
45387
  var range={ Min:null, Max:null };
45275
45388
  if (!this.Texts) return range;
45276
45389
 
45390
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45391
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45277
45392
  var xPointCount=this.ChartFrame.XPointCount;
45278
- var start=this.Data.DataOffset;
45279
- var end=start+xPointCount;
45280
45393
 
45281
- for(var i in this.Texts)
45394
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45282
45395
  {
45283
- var item=this.Texts[i];
45284
- if (!IFrameSplitOperator.IsNumber(item.Value)) continue;
45396
+ var kItem=this.Data.Data[i];
45397
+ var key=this.BuildKey(kItem);
45398
+ if (!this.MapCache.has(key)) continue;
45399
+ var mapItem=this.MapCache.get(key);
45400
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45285
45401
 
45286
- if (item.Index>=start && item.Index<end)
45402
+ for(k=0;k<mapItem.Data.length;++k)
45287
45403
  {
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;
45404
+ var item=mapItem.Data[k];
45405
+ var value=item.Value;
45406
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
45407
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45408
+
45409
+ if (range.Max==null) range.Max=value;
45410
+ else if (range.Max<value) range.Max=value;
45411
+ if (range.Min==null) range.Min=value;
45412
+ else if (range.Min>value) range.Min=value;
45292
45413
  }
45293
45414
  }
45294
45415
 
@@ -45805,7 +45926,7 @@ function ChartMultiHtmlDom()
45805
45926
  }
45806
45927
  }
45807
45928
 
45808
- //绘制SVG图标
45929
+ //绘制SVG图标 2.0
45809
45930
  function ChartDrawSVG()
45810
45931
  {
45811
45932
  this.newMethod=IChartPainting; //派生
@@ -61419,6 +61540,41 @@ function DynamicChartTitlePainting()
61419
61540
  return aryText;
61420
61541
  }
61421
61542
 
61543
+ this.ForamtMultiBarTitle=function(dataIndex, dataInfo)
61544
+ {
61545
+ if (!dataInfo.GetItemCallback) return null;
61546
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61547
+ var kItem=dataInfo.Data.Data[dataIndex];
61548
+ if (!kItem) return null;
61549
+
61550
+ var group=dataInfo.GetItemCallback(kItem);
61551
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61552
+
61553
+ var aryText=[];
61554
+ for(var i=0;i<group.Data.length;++i)
61555
+ {
61556
+ var item=group.Data[i];
61557
+ var config=item.ColorConfig;
61558
+
61559
+ var color=null;
61560
+ if (config.BGColor) color=config.BGColor;
61561
+ else if (config.Color) color=config.Color;
61562
+
61563
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61564
+
61565
+ var value=item.Data.Value;
61566
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61567
+
61568
+ var value2=item.Data.Value2;
61569
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=ChartData.GetKValue(kItem, item.Data.Value2);
61570
+ aryText.push({ Text:`[${this.FormatValue(value, dataInfo)}, ${this.FormatValue(value2, dataInfo)}] `, Color:color});
61571
+ }
61572
+
61573
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
61574
+
61575
+ return aryText;
61576
+ }
61577
+
61422
61578
  this.FormatVPVRTitle=function(pt, dataInfo)
61423
61579
  {
61424
61580
  var chart=dataInfo.Chart;
@@ -61762,6 +61918,12 @@ function DynamicChartTitlePainting()
61762
61918
  if (!aryText) return null;
61763
61919
  return { Text:null, ArrayText:aryText };
61764
61920
  }
61921
+ else if (item.DataType=="ChartMultiBar")
61922
+ {
61923
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
61924
+ if (!aryText) return null;
61925
+ return { Text:null, ArrayText:aryText };
61926
+ }
61765
61927
 
61766
61928
  value=item.Data.Data[dataIndex];
61767
61929
 
@@ -62187,6 +62349,11 @@ function DynamicChartTitlePainting()
62187
62349
  aryText=this.ForamtMultiPointTitle(dataIndex, item);
62188
62350
  if (!aryText) continue;
62189
62351
  }
62352
+ else if (item.DataType=="ChartMultiBar")
62353
+ {
62354
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
62355
+ if (!aryText) continue;
62356
+ }
62190
62357
  else
62191
62358
  {
62192
62359
  valueText=this.FormatValue(value,item);
@@ -123215,7 +123382,7 @@ function ScriptIndex(name,script,args,option)
123215
123382
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123216
123383
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123217
123384
 
123218
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123385
+ chart.Data=hqChart.GetKData(); //绑定K线
123219
123386
  chart.PointGroup=varItem.Draw.DrawData;
123220
123387
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123221
123388
  chart.BuildCacheData();
@@ -123238,17 +123405,18 @@ function ScriptIndex(name,script,args,option)
123238
123405
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123239
123406
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123240
123407
 
123241
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123408
+ chart.Data=hqChart.GetKData();//绑定K线
123242
123409
  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;
123410
+ chart.BuildCacheData();
123249
123411
 
123250
123412
  this.SetChartIndexName(chart);
123251
123413
  hqChart.ChartPaint.push(chart);
123414
+
123415
+ var titleIndex=windowIndex+1;
123416
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
123417
+ titleData.DataType="ChartMultiBar";
123418
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123419
+ hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123252
123420
  }
123253
123421
 
123254
123422
  this.CreateMultiText=function(hqChart,windowIndex,varItem,i)
@@ -123259,8 +123427,10 @@ function ScriptIndex(name,script,args,option)
123259
123427
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123260
123428
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123261
123429
 
123262
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123430
+ chart.Data=hqChart.GetKData();//绑定K线
123263
123431
  chart.Texts=varItem.Draw.DrawData;
123432
+ chart.BuildCacheData();
123433
+
123264
123434
  this.SetChartIndexName(chart);
123265
123435
  hqChart.ChartPaint.push(chart);
123266
123436
  }
@@ -123273,7 +123443,7 @@ function ScriptIndex(name,script,args,option)
123273
123443
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123274
123444
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123275
123445
 
123276
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123446
+ chart.Data=hqChart.GetKData();//绑定K线
123277
123447
  chart.Family=varItem.Draw.DrawData.Family;
123278
123448
  chart.AryIcon= varItem.Draw.DrawData.Icon;
123279
123449
  chart.BuildCacheData();
@@ -123289,10 +123459,8 @@ function ScriptIndex(name,script,args,option)
123289
123459
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123290
123460
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123291
123461
 
123292
- if (hqChart.ChartPaint[0].IsMinuteFrame())
123293
- chart.Data=hqChart.SourceData;
123294
- else
123295
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123462
+
123463
+ chart.Data=hqChart.GetKData()
123296
123464
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
123297
123465
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
123298
123466
  if (varItem.Draw.BuildKeyCallback) chart.BuildKeyCallback=varItem.Draw.BuildKeyCallback;
@@ -124800,11 +124968,7 @@ function OverlayScriptIndex(name,script,args,option)
124800
124968
  chart.ChartFrame=frame.Frame;
124801
124969
  chart.Identify=overlayIndex.Identify;
124802
124970
 
124803
- if (hqChart.ChartPaint[0].IsMinuteFrame())
124804
- chart.Data=hqChart.SourceData;
124805
- else
124806
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
124807
-
124971
+ chart.Data=hqChart.GetKData();
124808
124972
  chart.Family=varItem.Draw.Icon.Family;
124809
124973
  chart.TextFont=g_JSChartResource.TIPICON.TextFont;
124810
124974
 
@@ -124952,7 +125116,7 @@ function OverlayScriptIndex(name,script,args,option)
124952
125116
  chart.ChartFrame=frame.Frame;
124953
125117
  chart.Identify=overlayIndex.Identify;
124954
125118
 
124955
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125119
+ chart.Data=hqChart.GetKData();//绑定K线
124956
125120
  chart.PointGroup=varItem.Draw.DrawData;
124957
125121
  chart.BuildCacheData();
124958
125122
 
@@ -125002,14 +125166,16 @@ function OverlayScriptIndex(name,script,args,option)
125002
125166
  chart.ChartFrame=frame.Frame;
125003
125167
  chart.Identify=overlayIndex.Identify;
125004
125168
 
125005
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125169
+ chart.Data=hqChart.GetKData();//绑定K线
125006
125170
  chart.Bars=varItem.Draw.DrawData;
125171
+ chart.BuildCacheData();
125007
125172
 
125008
125173
  var titleIndex=windowIndex+1;
125009
125174
  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";
125175
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
125176
+ titleData.DataType="ChartMultiBar";
125177
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
125178
+
125013
125179
  titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
125014
125180
 
125015
125181
  this.SetChartIndexName(chart);
@@ -125027,8 +125193,10 @@ function OverlayScriptIndex(name,script,args,option)
125027
125193
  chart.ChartFrame=frame.Frame;
125028
125194
  chart.Identify=overlayIndex.Identify;
125029
125195
 
125030
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125196
+ chart.Data=hqChart.GetKData();//绑定K线
125031
125197
  chart.Texts=varItem.Draw.DrawData;
125198
+ chart.BuildCacheData();
125199
+
125032
125200
  this.SetChartIndexName(chart);
125033
125201
  frame.ChartPaint.push(chart);
125034
125202
  }
@@ -125044,7 +125212,7 @@ function OverlayScriptIndex(name,script,args,option)
125044
125212
  chart.ChartFrame=frame.Frame;
125045
125213
  chart.Identify=overlayIndex.Identify;
125046
125214
 
125047
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125215
+ chart.Data=hqChart.GetKData();//绑定K线
125048
125216
  chart.Family=varItem.Draw.DrawData.Family;
125049
125217
  chart.AryIcon= varItem.Draw.DrawData.Icon;
125050
125218
  chart.BuildCacheData();
@@ -125062,11 +125230,8 @@ function OverlayScriptIndex(name,script,args,option)
125062
125230
  chart.ChartBorder=frame.Frame.ChartBorder;
125063
125231
  chart.ChartFrame=frame.Frame;
125064
125232
  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线
125233
+ chart.Data=hqChart.GetKData();
125234
+
125070
125235
 
125071
125236
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
125072
125237
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
@@ -126171,7 +126336,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126171
126336
  drawItem.Text=draw.Text;
126172
126337
  drawItem.Name=draw.Name;
126173
126338
  drawItem.DrawType=draw.DrawType;
126174
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126339
+ drawItem.DrawData=draw.DrawData;
126175
126340
  outVarItem.Draw=drawItem;
126176
126341
 
126177
126342
  result.push(outVarItem);
@@ -126222,8 +126387,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126222
126387
  drawItem.Text=draw.Text;
126223
126388
  drawItem.Name=draw.Name;
126224
126389
  drawItem.DrawType=draw.DrawType;
126225
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126226
- this.GetKLineData(drawItem.DrawData, hqChart);
126390
+ drawItem.DrawData=draw.DrawData;
126227
126391
  outVarItem.Draw=drawItem;
126228
126392
  result.push(outVarItem);
126229
126393
  }
@@ -126718,8 +126882,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126718
126882
  drawItem.Text=draw.Text;
126719
126883
  drawItem.Name=draw.Name;
126720
126884
  drawItem.DrawType=draw.DrawType;
126721
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126722
- this.GetKLineData(drawItem.DrawData, hqChart);
126885
+ drawItem.DrawData=draw.DrawData;
126723
126886
  outVarItem.Draw=drawItem;
126724
126887
  result.push(outVarItem);
126725
126888
  }
@@ -142564,7 +142727,7 @@ function ScrollBarBGChart()
142564
142727
 
142565
142728
 
142566
142729
 
142567
- var HQCHART_VERSION="1.1.14339";
142730
+ var HQCHART_VERSION="1.1.14348";
142568
142731
 
142569
142732
  function PrintHQChartVersion()
142570
142733
  {