hqchart 1.1.14320 → 1.1.14336

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.
@@ -6771,6 +6771,9 @@ var JSCHART_MENU_ID=
6771
6771
  CMD_MODIFY_INDEX_PARAM:45, //指标删除修改 [windowIndex, ]
6772
6772
  CMD_MODIFY_OVERLAY_INDEX_PARAM:46, //叠加指标修改 [windowIndex, ID ]
6773
6773
 
6774
+ CMD_LOCK_CROSSCURSOR:47, //锁十字光标
6775
+ CMD_UNLOCK_CROSSCURSOR:48, //解锁十字光标
6776
+
6774
6777
 
6775
6778
  CMD_REPORT_CHANGE_BLOCK_ID:100, //报价列表 切换板块ID
6776
6779
  CMD_REPORT_COLUMN_SORT_ID:101, //报价列表 表头排序 Arg[列序号, 排序方向]
@@ -14112,6 +14115,12 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
14112
14115
  var sendData={ e:null, WindowIndex:param, Type:2, Identify:aryArgs[1] };
14113
14116
  this.ShowModifyIndexParamDialog(sendData);
14114
14117
  break;
14118
+ case JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR:
14119
+ if (srcParam) this.LockCorssCursor(srcParam);
14120
+ break;
14121
+ case JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR:
14122
+ if (this.IsLockCorssCursor()) this.UnlockCorssCursor({ Draw:true })
14123
+ break;
14115
14124
  }
14116
14125
  }
14117
14126
 
@@ -14198,13 +14207,13 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
14198
14207
  if (!this.JSPopMenu) return;
14199
14208
  var x=data.X, y=data.Y;
14200
14209
  var frameID=data.FrameID;
14201
- var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
14210
+ var menuData={ Menu:this.GetRightMenuData(frameID, data), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
14202
14211
  menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
14203
14212
 
14204
14213
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CREATE_RIGHT_MENU);
14205
14214
  if (event && event.Callback)
14206
14215
  {
14207
- var sendData={ MenuData:menuData, FrameID:frameID };
14216
+ var sendData={ MenuData:menuData, FrameID:frameID, Data:data };
14208
14217
  event.Callback(event, sendData, this);
14209
14218
  }
14210
14219
 
@@ -24621,9 +24630,9 @@ function HQTradeFrame()
24621
24630
  return null;
24622
24631
  }
24623
24632
 
24624
- this.GetXFromIndex=function(index)
24633
+ this.GetXFromIndex=function(index,isLimit)
24625
24634
  {
24626
- return this.SubFrame[0].Frame.GetXFromIndex(index);
24635
+ return this.SubFrame[0].Frame.GetXFromIndex(index,isLimit);
24627
24636
  }
24628
24637
 
24629
24638
  this.GetYFromData=function(value)
@@ -27623,15 +27632,15 @@ function ChartData()
27623
27632
  this.FindDataIndexByDateTime=function(aryDateTime) //aryDateTime=[ { Date:, Time:, Index:-1 }, ......]
27624
27633
  {
27625
27634
  var findCount=0;
27626
- for(var i in aryDateTime)
27635
+ for(var i=0;i<aryDateTime.length;++i)
27627
27636
  {
27628
27637
  aryDateTime[i].Index=-1;
27629
27638
  }
27630
27639
 
27631
- for(var i in this.Data)
27640
+ for(var i=0;i<this.Data.length;++i)
27632
27641
  {
27633
27642
  var item=this.Data[i];
27634
- for(var j in aryDateTime)
27643
+ for(var j=0;j<aryDateTime.length;++j)
27635
27644
  {
27636
27645
  var findItem=aryDateTime[j];
27637
27646
  if (findItem.Index>=0) continue;
@@ -27640,7 +27649,7 @@ function ChartData()
27640
27649
  {
27641
27650
  if (findItem.Date==item.Date && findItem.Time==item.Time)
27642
27651
  {
27643
- findItem.Index=parseInt(i);
27652
+ findItem.Index=i;
27644
27653
  ++findCount;
27645
27654
  break;
27646
27655
  }
@@ -27649,7 +27658,7 @@ function ChartData()
27649
27658
  {
27650
27659
  if (findItem.Date==item.Date)
27651
27660
  {
27652
- findItem.Index=parseInt(i);
27661
+ findItem.Index=i;
27653
27662
  ++findCount;
27654
27663
  break;
27655
27664
  }
@@ -28273,6 +28282,30 @@ ChartData.GetPeriodName=function(period)
28273
28282
  }
28274
28283
 
28275
28284
 
28285
+ ChartData.GetKValue=function(kItem, valueName)
28286
+ {
28287
+ if (!kItem) return null;
28288
+
28289
+ switch(valueName)
28290
+ {
28291
+ case "HIGH":
28292
+ case "H":
28293
+ return kItem.High;
28294
+ case "L":
28295
+ case "LOW":
28296
+ return kItem.Low;
28297
+ case "C":
28298
+ case "CLOSE":
28299
+ return kItem.Close;
28300
+ case "O":
28301
+ case "OPEN":
28302
+ return KItem.Open;
28303
+ default:
28304
+ return null;
28305
+ }
28306
+ }
28307
+
28308
+
28276
28309
 
28277
28310
  function TooltipData() //提示信息
28278
28311
  {
@@ -35863,199 +35896,292 @@ function ChartSimpleRadar()
35863
35896
  delete this.newMethod;
35864
35897
 
35865
35898
  this.ClassName='ChartSimpleRadar'; //类名
35866
- this.BorderPoint=[]; //边框点
35867
- this.DataPoint=[]; //数据点
35868
- this.CenterPoint={};
35869
- this.StartAngle=0;
35870
- this.Color='rgb(198,198,198)';
35871
- this.AreaColor='rgba(242,154,118,0.4)'; //面积图颜色
35899
+
35900
+ this.AreaColor='rgba(242,154,118,0.4)'; //
35872
35901
  this.AreaLineColor='rgb(242,154,118)';
35873
- this.TitleFont=24*GetDevicePixelRatio()+'px 微软雅黑';
35874
- this.TitleColor='rgb(102,102,102)';
35875
- this.BGColor = ['rgb(255,255,255)', 'rgb(224,224,224)']//背景色
35902
+
35903
+ this.TitleColor=g_JSChartResource.ChartSimpleRadar.TextColor;
35904
+ this.TextFontConfig=CloneData(g_JSChartResource.ChartSimpleRadar.TextFont);
35905
+ this.Offset=CloneData(g_JSChartResource.ChartSimpleRadar.Offset);
35906
+ this.BorderColor=g_JSChartResource.ChartSimpleRadar.BorderColor;
35907
+ this.AryBGColor=g_JSChartResource.ChartSimpleRadar.AryBGColor.slice();//背景色
35908
+ this.AryAreaConfig=g_JSChartResource.ChartSimpleRadar.AryArea.slice(); //面积图颜色
35909
+
35910
+ this.StartAngle=270;
35911
+ this.Radius=50;
35912
+ this.AryBorder=[1, 0.75, 0.5, 0.25];
35913
+ this.AryIndex; //指标{ Name:, Max:100, Min:0 },
35876
35914
 
35877
- this.DrawBorder=function() //画边框
35915
+ this.CenterPoint={};
35916
+ this.RectClient={ };
35917
+ this.AryIndexCache=[];
35918
+ this.MapDataCache=new Map(); //key=name value={ Data:[] }
35919
+ this.TextFont;
35920
+
35921
+
35922
+ this.ReloadResource=function(resource)
35878
35923
  {
35879
- if (this.BorderPoint.length<=0) return;
35924
+ this.TitleColor=g_JSChartResource.ChartSimpleRadar.TextColor;
35925
+ this.TextFontConfig=CloneData(g_JSChartResource.ChartSimpleRadar.TextFont);
35926
+ this.Offset=CloneData(g_JSChartResource.ChartSimpleRadar.Offset);
35927
+ this.BorderColor=g_JSChartResource.ChartSimpleRadar.BorderColor;
35928
+ this.AryBGColor=g_JSChartResource.ChartSimpleRadar.AryBGColor.slice();//背景色
35929
+ this.AryAreaConfig=g_JSChartResource.ChartSimpleRadar.AryArea.slice(); //面积图颜色
35930
+ }
35880
35931
 
35881
- this.Canvas.font=this.TitleFont;
35882
- this.Canvas.strokeStyle = this.Color;
35883
- const aryBorder=[1,0.8,0.6,0.4,0.2];
35884
- for (let j in aryBorder)
35932
+ this.DrawBorder=function() //画边框
35933
+ {
35934
+ this.Canvas.strokeStyle = this.BorderColor;
35935
+ this.Canvas.font=this.TextFont;
35936
+ for(var i=0;i<this.AryBorder.length;++i)
35885
35937
  {
35886
- var rate = aryBorder[j];
35887
- var isFirstDraw=true;
35888
- for(let i in this.BorderPoint)
35938
+ var rate = this.AryBorder[i];
35939
+ var radius=this.RectClient.Radius*rate;
35940
+ var bFirstDraw=true;
35941
+ for(var j=0;j<this.AryIndexCache.length;++j)
35889
35942
  {
35890
- var item=this.BorderPoint[i];
35891
- item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180) * rate;
35892
- item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180) * rate;
35893
- if (isFirstDraw)
35943
+ var item=this.AryIndexCache[j];
35944
+ var x = this.CenterPoint.X + radius * Math.cos(item.Angle * Math.PI / 180);
35945
+ var y = this.CenterPoint.Y + radius * Math.sin(item.Angle * Math.PI / 180);
35946
+ if (bFirstDraw)
35894
35947
  {
35895
35948
  this.Canvas.beginPath();
35896
- this.Canvas.moveTo(item.X,item.Y);
35897
- isFirstDraw=false;
35949
+ this.Canvas.moveTo(x,y);
35950
+ bFirstDraw=false;
35898
35951
  }
35899
35952
  else
35900
35953
  {
35901
- this.Canvas.lineTo(item.X,item.Y);
35954
+ this.Canvas.lineTo(x,y);
35902
35955
  }
35903
35956
  }
35904
35957
 
35905
35958
  this.Canvas.closePath();
35906
35959
  this.Canvas.stroke();
35907
- this.Canvas.fillStyle = this.BGColor[j%2==0?0:1];
35908
- this.Canvas.fill();
35960
+
35961
+ if (IFrameSplitOperator.IsNonEmptyArray(this.AryBGColor))
35962
+ {
35963
+ this.Canvas.fillStyle = this.AryBGColor[i%this.AryBGColor.length];
35964
+ this.Canvas.fill();
35965
+ }
35909
35966
  }
35910
35967
 
35911
35968
  this.Canvas.beginPath();
35912
- for(let i in this.BorderPoint)
35969
+ for(var i=0;i<this.AryIndexCache.length;++i)
35913
35970
  {
35914
- var item=this.BorderPoint[i];
35915
- item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);
35916
- item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);
35971
+ var item=this.AryIndexCache[i];
35972
+ var x = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);
35973
+ var y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);
35917
35974
  this.Canvas.moveTo(this.CenterPoint.X,this.CenterPoint.Y);
35918
- this.Canvas.lineTo(item.X,item.Y);
35919
- this.DrawText(item);
35975
+ this.Canvas.lineTo(x,y);
35976
+ this.DrawText(item, x, y);
35920
35977
  }
35921
35978
  this.Canvas.stroke();
35979
+
35980
+ }
35981
+
35982
+ this.GetRadarRate=function(indexItem, value)
35983
+ {
35984
+ var range={ Max:100, Min:0 };
35985
+ if (IFrameSplitOperator.IsNumber(indexItem.Max)) range.Max=indexItem.Max;
35986
+ if (IFrameSplitOperator.IsNumber(indexItem.Min)) range.Min=indexItem.Min;
35987
+
35988
+ if (value>range.Max) value=range.Max;
35989
+ else if (value<range.Min) value=range.Min;
35990
+
35991
+ return (value-range.Min)/(range.Max-range.Min);
35922
35992
  }
35923
35993
 
35924
35994
  this.DrawArea=function()
35925
35995
  {
35926
- if (!this.DataPoint || this.DataPoint.length<=0) return;
35996
+ if (this.MapDataCache.size<=0) return;
35927
35997
 
35928
- this.Canvas.fillStyle = this.AreaColor;
35929
- this.Canvas.strokeStyle = this.AreaLineColor;
35930
- this.Canvas.beginPath();
35931
- var isFirstDraw=true;
35932
- for(let i in this.DataPoint)
35998
+ var index=0;
35999
+ for(var mapItem of this.MapDataCache)
35933
36000
  {
35934
- var item=this.DataPoint[i];
35935
- if (isFirstDraw)
36001
+ var mapData=mapItem[1].MapData;
36002
+
36003
+ var bFirstDraw=true;
36004
+ var pointCount=0;
36005
+ for(var i=0;i<this.AryIndexCache.length;++i)
35936
36006
  {
35937
- this.Canvas.beginPath();
35938
- this.Canvas.moveTo(item.X,item.Y);
35939
- isFirstDraw=false;
36007
+ var indexItem=this.AryIndexCache[i];
36008
+ if (!indexItem.Data || !indexItem.Data.Name) continue;
36009
+ if (!mapData.has(indexItem.Data.Name)) continue;
36010
+ var item=mapData.get(indexItem.Data.Name);
36011
+ if (!item.Data && !IFrameSplitOperator.IsNumber(item.Data.Value)) conintue;
36012
+
36013
+ var widthRate=this.GetRadarRate(indexItem, item.Data.Value);
36014
+ var x = this.CenterPoint.X+indexItem.Radius*widthRate*Math.cos(indexItem.Angle * Math.PI / 180);
36015
+ var y = this.CenterPoint.Y+indexItem.Radius*widthRate*Math.sin(indexItem.Angle * Math.PI / 180);
36016
+
36017
+ if (bFirstDraw)
36018
+ {
36019
+ this.Canvas.beginPath();
36020
+ this.Canvas.moveTo(x,y);
36021
+ bFirstDraw=false;
36022
+ ++pointCount;
36023
+ }
36024
+ else
36025
+ {
36026
+ this.Canvas.lineTo(x,y);
36027
+ ++pointCount;
36028
+ }
35940
36029
  }
35941
- else
36030
+
36031
+ if (pointCount>0)
35942
36032
  {
35943
- this.Canvas.lineTo(item.X,item.Y);
36033
+ this.Canvas.closePath();
36034
+
36035
+ var config=this.AryAreaConfig[index%this.AryAreaConfig.length];
36036
+ if (config.Color)
36037
+ {
36038
+ this.Canvas.fillStyle = config.Color;
36039
+ this.Canvas.fill();
36040
+ }
36041
+
36042
+ if (config.LineColor)
36043
+ {
36044
+ this.Canvas.strokeStyle = config.LineColor;
36045
+ this.Canvas.stroke();
36046
+ }
35944
36047
  }
35945
- }
35946
36048
 
35947
- this.Canvas.closePath();
35948
- this.Canvas.fill();
35949
- this.Canvas.stroke();
36049
+ ++index;
36050
+ }
35950
36051
  }
35951
36052
 
35952
- this.DrawText=function(item)
36053
+ this.DrawText=function(item, x, y)
35953
36054
  {
35954
- if (!item.Text) return;
36055
+ if (!item.Data || !item.Data.Name) return;
35955
36056
 
35956
36057
  //JSConsole.Chart.Log(item.Text, item.Angle);
35957
36058
  this.Canvas.fillStyle = this.TitleColor;
35958
- var xText = item.X, yText = item.Y;
36059
+ var xText = x, yText =y;
36060
+
36061
+ var angle=item.Angle%360;
35959
36062
 
35960
36063
  //显示每个角度的位置
35961
- if (item.Angle > 0 && item.Angle < 45) {
36064
+ if (angle > 0 && angle < 45) {
35962
36065
  this.Canvas.textAlign = 'left';
35963
36066
  this.Canvas.textBaseline = 'middle';
35964
36067
  xText += 2;
35965
36068
  }
35966
- else if (item.Angle >= 0 && item.Angle < 90) {
36069
+ else if (angle >= 45 && angle < 90) {
35967
36070
  this.Canvas.textAlign = 'left';
35968
36071
  this.Canvas.textBaseline = 'top';
35969
36072
  xText += 2;
35970
36073
  }
35971
- else if (item.Angle >= 90 && item.Angle < 135) {
36074
+ else if (angle==90)
36075
+ {
36076
+ this.Canvas.textAlign = 'center';
36077
+ this.Canvas.textBaseline = 'top';
36078
+ yText+=2;
36079
+ }
36080
+ else if (angle >= 90 && angle < 135) {
35972
36081
  this.Canvas.textAlign = 'right';
35973
36082
  this.Canvas.textBaseline = 'top';
35974
36083
  xText -= 2;
35975
36084
  }
35976
- else if (item.Angle >= 135 && item.Angle < 180) {
36085
+ else if (angle >= 135 && angle < 180) {
35977
36086
  this.Canvas.textAlign = 'right';
35978
36087
  this.Canvas.textBaseline = 'top';
35979
36088
  xText -= 2;
35980
36089
  }
35981
- else if (item.Angle >= 180 && item.Angle < 225) {
36090
+ else if (angle >= 180 && angle < 225) {
35982
36091
  this.Canvas.textAlign = 'right';
35983
36092
  this.Canvas.textBaseline = 'middle';
35984
36093
  xText -= 2;
35985
36094
  }
35986
- else if (item.Angle >= 225 && item.Angle <= 270) {
36095
+ else if (angle >= 225 && angle <= 270) {
35987
36096
  this.Canvas.textAlign = 'center';
35988
36097
  this.Canvas.textBaseline = 'bottom';
35989
36098
  }
35990
- else if (item.Angle > 270 && item.Angle < 315) {
36099
+ else if (angle > 270 && angle < 315) {
35991
36100
  this.Canvas.textAlign = 'left';
35992
36101
  this.Canvas.textBaseline = 'bottom';
35993
36102
  xText += 2;
35994
36103
  }
35995
- else {
36104
+ else
36105
+ {
35996
36106
  this.Canvas.textAlign = 'left';
35997
36107
  this.Canvas.textBaseline = 'middle';
35998
36108
  xText += 2;
35999
36109
  }
36000
36110
 
36001
- this.Canvas.fillText(item.Text, xText, yText);
36111
+ this.Canvas.fillText(item.Data.Name, xText, yText);
36002
36112
  }
36003
36113
 
36004
36114
  this.Draw=function()
36005
36115
  {
36006
- this.BorderPoint=[];
36007
- this.DataPoint=[];
36008
- this.CenterPoint={};
36009
- if (!this.Data || !this.Data.Data || !(this.Data.Data.length>0))
36010
- this.CalculatePoints(null);
36011
- else
36012
- this.CalculatePoints(this.Data.Data);
36116
+ this.AryIndexCache=[];
36117
+ this.MapData=new Map();
36118
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.AryIndex)) return;
36119
+
36120
+ this.CalculateSize();
36013
36121
 
36014
36122
  this.DrawBorder();
36123
+
36015
36124
  this.DrawArea();
36016
36125
  }
36017
36126
 
36018
- this.CalculatePoints=function(data)
36127
+ this.BuildCacheData=function()
36019
36128
  {
36020
- let left=this.ChartBorder.GetLeft();
36021
- let right=this.ChartBorder.GetRight();
36022
- let top=this.ChartBorder.GetTop();
36023
- let bottom=this.ChartBorder.GetBottom();
36024
- let width=this.ChartBorder.GetWidth();
36025
- let height=this.ChartBorder.GetHeight();
36129
+ this.MapDataCache=new Map();
36026
36130
 
36027
- let ptCenter={X:left+width/2, Y:top+height/2}; //中心点
36028
- let radius=Math.min(width/2,height/2)-2 //半径
36029
- let count=Math.max(5,data?data.length:0);
36030
- let averageAngle=360/count;
36031
- for(let i=0;i<count;++i)
36131
+ for(var i=0;i<this.Data.Data.length;++i)
36032
36132
  {
36033
- let ptBorder = { Index: i, Radius: radius, Angle: i * averageAngle + this.StartAngle };
36034
- let angle = ptBorder.Angle;
36133
+ var item=this.Data.Data[i];
36134
+ if (!this.MapDataCache.has(item.Group))
36135
+ {
36136
+ this.MapDataCache.set(item.Group, { MapData:new Map() })
36137
+ }
36138
+
36139
+ var mpaItem=this.MapDataCache.get(item.Group);
36140
+ mpaItem.MapData.set(item.Name, { Data:item });
36141
+ }
36142
+ }
36143
+
36144
+ this.CalculateSize=function(data)
36145
+ {
36146
+ var border=this.ChartBorder.GetBorder();
36147
+ var pixelRatio=GetDevicePixelRatio();
36148
+ this.TextFont=`${this.TextFontConfig.Size*pixelRatio}px ${ this.TextFontConfig.Name}`;
36149
+ var fontHeight=this.GetFontHeight(this.TextFont,"擎")+1;
36035
36150
 
36036
- if (data && i<data.length)
36151
+ var maxTextWidth=0;
36152
+ if (IFrameSplitOperator.IsNonEmptyArray(this.AryIndex))
36153
+ {
36154
+ for(var i=0;i<this.AryIndex.length;++i)
36037
36155
  {
36038
- var item=data[i];
36039
- let ptData={Index:i,Text:item.Text};
36040
- ptBorder.Text=item.Name;
36041
- if (!item.Value)
36042
- {
36043
- ptData.X=ptCenter.X;
36044
- ptData.Y=ptCenter.Y;
36045
- }
36046
- else
36047
- {
36048
- var value=item.Value;
36049
- if (value>=1) value=1;
36050
- var dataRadius=radius*value;
36051
- ptData.X=ptCenter.X+dataRadius*Math.cos(angle*Math.PI/180);
36052
- ptData.Y=ptCenter.Y+dataRadius*Math.sin(angle*Math.PI/180);
36053
- }
36156
+ var item=this.AryIndex[i];
36157
+ if (!item.Name) continue;
36158
+ var textWidth=this.Canvas.measureText(item.Name).width;
36159
+ if (maxTextWidth<textWidth) maxTextWidth=textWidth;
36160
+ }
36161
+ }
36162
+
36163
+ var radius=this.Radius*2*pixelRatio; //半径
36164
+ this.RectClient={ Width:radius*2, Height:radius*2, Radius:radius };
36165
+ this.RectClient.Right=border.Right+this.Offset.X-maxTextWidth;
36166
+ this.RectClient.Top=border.TopEx+this.Offset.Y+fontHeight;
36167
+ this.RectClient.Left=this.RectClient.Right-this.RectClient.Width;
36168
+ this.RectClient.Bottom=this.RectClient.Top+this.RectClient.Height;
36169
+
36170
+ var ptCenter={X:this.RectClient.Left+this.RectClient.Width/2, Y:this.RectClient.Top+this.RectClient.Height/2}; //中心点
36171
+
36172
+ var count=Math.max(5,this.AryIndex.length);
36173
+ var averageAngle=360/count;
36174
+ for(var i=0;i<count;++i)
36175
+ {
36176
+ var angle=i*averageAngle+this.StartAngle;
36054
36177
 
36055
- this.DataPoint.push(ptData);
36178
+ var indexItem={ Data:null, Index:i, Angle:angle, Radius:radius };
36179
+ if (this.AryIndex && this.AryIndex[i])
36180
+ {
36181
+ indexItem.Data=this.AryIndex[i];
36056
36182
  }
36057
36183
 
36058
- this.BorderPoint.push(ptBorder);
36184
+ this.AryIndexCache.push(indexItem);
36059
36185
  }
36060
36186
 
36061
36187
  this.CenterPoint=ptCenter;
@@ -36064,7 +36190,7 @@ function ChartSimpleRadar()
36064
36190
  //空数据
36065
36191
  this.DrawEmptyData=function()
36066
36192
  {
36067
- JSConsole.Chart.Log('[ChartPie::DrawEmptyData]')
36193
+ JSConsole.Chart.Log('[ChartSimpleRadar::DrawEmptyData]')
36068
36194
  }
36069
36195
  }
36070
36196
 
@@ -44720,98 +44846,219 @@ function ChartMultiPoint()
44720
44846
  delete this.newMethod;
44721
44847
 
44722
44848
  this.ClassName="ChartMultiPoint";
44723
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
44849
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
44724
44850
 
44725
44851
 
44726
44852
  this.IsHScreen=false;
44727
44853
  this.LineWidth=1;
44728
44854
  this.PointRadius=5;
44729
44855
 
44856
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44857
+ this.GetKValue=ChartData.GetKValue;
44858
+
44859
+ this.BuildKey=function(item)
44860
+ {
44861
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44862
+ else return item.Date;
44863
+ }
44864
+
44865
+ this.GetItem=function(kItem)
44866
+ {
44867
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44868
+
44869
+ var key=this.BuildKey(kItem);
44870
+ if (!this.MapCache.has(key)) return null;
44871
+
44872
+ return this.MapCache.get(key);
44873
+ }
44874
+
44875
+ this.BuildCacheData=function()
44876
+ {
44877
+ var mapData=new Map();
44878
+ this.MapCache=mapData;
44879
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44880
+
44881
+ for(var i=0; i<this.PointGroup.length; ++i)
44882
+ {
44883
+ var groupItem=this.PointGroup[i];
44884
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44885
+
44886
+ var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44887
+ if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
44888
+
44889
+ for(var j=0; j<groupItem.Point.length; ++j)
44890
+ {
44891
+ var point=groupItem.Point[j];
44892
+ var key=this.BuildKey(point);
44893
+
44894
+ var item={ Data:point, ColorConfig:clrConfig }
44895
+ if (mapData.has(key))
44896
+ {
44897
+ var mapItem=mapData.get(key);
44898
+ mapItem.Data.push(item);
44899
+ }
44900
+ else
44901
+ {
44902
+ mapData.set(key,{ Data:[item] });
44903
+ }
44904
+ }
44905
+ }
44906
+ }
44907
+
44730
44908
  this.Draw=function()
44731
44909
  {
44732
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
44733
- if (!this.Data || this.Data.length<=0) return;
44910
+ if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44911
+ if (this.IsShowIndexTitleOnly()) return;
44912
+ if (this.IsHideScriptIndex()) return;
44913
+
44914
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44734
44915
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44916
+ if (!this.MapCache || this.MapCache.size<=0) return;
44735
44917
 
44736
44918
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44737
44919
  var xPointCount=this.ChartFrame.XPointCount;
44738
- var offset=this.Data.DataOffset;
44739
- var pixel=GetDevicePixelRatio();
44920
+ var dataWidth=this.ChartFrame.DataWidth;
44921
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44922
+ var isMinute=this.IsMinuteFrame();
44923
+
44924
+ var border=this.GetBorder();
44925
+ if (this.IsHScreen)
44926
+ {
44927
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44928
+ var chartright=border.BottomEx;
44929
+ var chartLeft=border.TopEx;
44930
+ }
44931
+ else
44932
+ {
44933
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44934
+ var chartright=border.RightEx;
44935
+ var chartLeft=border.LeftEx;
44936
+ }
44937
+
44938
+ //计算所有的点位置
44939
+ var mapPoint=new Map();
44940
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44941
+ {
44942
+ var kItem=this.Data.Data[i];
44943
+ var key=this.BuildKey(kItem);
44944
+ if (!this.MapCache.has(key)) continue;
44945
+ var mapItem=this.MapCache.get(key);
44946
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44947
+
44948
+ if (isMinute)
44949
+ {
44950
+ var x=this.ChartFrame.GetXFromIndex(j);
44951
+ }
44952
+ else
44953
+ {
44954
+ var left=xOffset;
44955
+ var right=xOffset+dataWidth;
44956
+ if (right>chartright) break;
44957
+ var x=left+(right-left)/2;
44958
+ }
44959
+
44960
+ this.CalculateItem(mapItem, kItem, x, mapPoint);
44961
+ }
44962
+
44963
+ if (mapPoint.size<=0) return;
44740
44964
 
44741
44965
  this.Canvas.save();
44742
44966
  this.ClipClient(this.IsHScreen);
44743
-
44744
- for(var i=0; i<this.PointGroup.length; ++i)
44967
+
44968
+ this.DrawAllPoint(mapPoint);
44969
+
44970
+ this.Canvas.restore();
44971
+ }
44972
+
44973
+ this.CalculateItem=function(groupItem, kItem, x, mapPoint)
44974
+ {
44975
+ for(var i=0; i<groupItem.Data.length; ++i)
44976
+ {
44977
+ var item=groupItem.Data[i];
44978
+ var value=item.Data.Value;
44979
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44980
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44981
+
44982
+ var y=this.ChartFrame.GetYFromData(value,false);
44983
+
44984
+ var strConfig=JSON.stringify(item.ColorConfig);
44985
+ if (!mapPoint.has(strConfig)) mapPoint.set(strConfig, { AryPoint:[]});
44986
+ var mapItem=mapPoint.get(strConfig);
44987
+
44988
+ mapItem.AryPoint.push({ X:x, Y:y, Data:item });
44989
+ }
44990
+ }
44991
+
44992
+ this.DrawAllPoint=function(mapPoint)
44993
+ {
44994
+ var pixelRatio=GetDevicePixelRatio();
44995
+
44996
+ for(var mapItem of mapPoint)
44745
44997
  {
44746
- var item=this.PointGroup[i];
44747
- var color=item.Color;
44748
- var bgColor=item.BGColor;
44749
- var lineWidth=this.LineWidth;
44750
- var radius=this.PointRadius;
44751
- if (IFrameSplitOperator.IsNumber(item.LineWidth)) lineWidth=item.LineWidth;
44752
- if (IFrameSplitOperator.IsNumber(item.PointRadius)) radius=item.PointRadius;
44998
+ var aryPoint=mapItem[1].AryPoint;
44999
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
45000
+ var config=null;
44753
45001
  var path=new Path2D();
44754
45002
  var count=0;
44755
-
44756
- for(var j=0; j<item.Point.length; ++j)
45003
+ for(var i=0;i<aryPoint.length;++i)
44757
45004
  {
44758
- var point=item.Point[j];
44759
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
44760
-
44761
- var index=point.Index-offset;
44762
- if (index>=0 && index<xPointCount)
44763
- {
44764
- var x=this.ChartFrame.GetXFromIndex(index);
44765
- var y=this.ChartFrame.GetYFromData(point.Value, false);
45005
+ var item=aryPoint[i];
45006
+ if (!config) config=item.Data.ColorConfig;
44766
45007
 
44767
- var pointPath = new Path2D();
44768
- if (this.IsHScreen)
44769
- pointPath.arc(y,x,radius*pixel,0,360,false);
44770
- else
44771
- pointPath.arc(x,y,radius*pixel,0,360,false);
45008
+ var pointPath = new Path2D();
45009
+ if (this.IsHScreen)
45010
+ pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
45011
+ else
45012
+ pointPath.arc(item.X,item.Y,config.Radius**pixelRatio,0,360,false);
44772
45013
 
44773
- path.addPath(pointPath);
44774
- ++count;
44775
- }
45014
+ path.addPath(pointPath);
45015
+ ++count;
44776
45016
  }
44777
45017
 
44778
- if (count>0 && (bgColor || color))
45018
+ if (count>0 && config)
44779
45019
  {
44780
- this.Canvas.lineWidth=lineWidth*pixel;
44781
- this.Canvas.fillStyle=bgColor; //背景填充颜色
44782
- this.Canvas.strokeStyle=color;
45020
+ if (config.BGColor)
45021
+ {
45022
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
45023
+ this.Canvas.fill(path);
45024
+ }
44783
45025
 
44784
- if (bgColor) this.Canvas.fill(path);
44785
- if (color) this.Canvas.stroke(path);
45026
+ if (config.Color)
45027
+ {
45028
+ this.Canvas.lineWidth=config.LineWidth*pixelRatio;
45029
+ this.Canvas.strokeStyle=config.Color;
45030
+ this.Canvas.stroke(path);
45031
+ }
44786
45032
  }
44787
-
44788
45033
  }
44789
-
44790
- this.Canvas.restore();
44791
45034
  }
44792
45035
 
44793
45036
  this.GetMaxMin=function()
44794
45037
  {
44795
45038
  var range={ Min:null, Max:null };
45039
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45040
+ if (!this.MapCache || this.MapCache.size<=0) return;
44796
45041
  var xPointCount=this.ChartFrame.XPointCount;
44797
- var start=this.Data.DataOffset;
44798
- var end=start+xPointCount;
44799
45042
 
44800
- for(var i=0; i<this.PointGroup.length; ++i)
45043
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44801
45044
  {
44802
- var item=this.PointGroup[i];
44803
- if (!IFrameSplitOperator.IsNonEmptyArray(item.Point)) continue;
45045
+ var kItem=this.Data.Data[i];
45046
+ var key=this.BuildKey(kItem);
45047
+ if (!this.MapCache.has(key)) continue;
45048
+ var mapItem=this.MapCache.get(key);
45049
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44804
45050
 
44805
- for(var j=0; j<item.Point.length; ++j)
45051
+ for(k=0;k<mapItem.Data.length;++k)
44806
45052
  {
44807
- var point=item.Point[j];
44808
- if (point.Index>=start && point.Index<end)
44809
- {
44810
- if (range.Max==null) range.Max=point.Value;
44811
- else if (range.Max<point.Value) range.Max=point.Value;
44812
- if (range.Min==null) range.Min=point.Value;
44813
- else if (range.Min>point.Value) range.Min=point.Value;
44814
- }
45053
+ var item=mapItem.Data[k];
45054
+ var value=item.Data.Value;
45055
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
45056
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45057
+
45058
+ if (range.Max==null) range.Max=value;
45059
+ else if (range.Max<value) range.Max=value;
45060
+ if (range.Min==null) range.Min=value;
45061
+ else if (range.Min>value) range.Min=value;
44815
45062
  }
44816
45063
  }
44817
45064
 
@@ -45078,6 +45325,8 @@ function ChartMultiSVGIconV2()
45078
45325
  this.IconRect=[]; //0=序号,1=区域
45079
45326
 
45080
45327
  this.MapCache=null; //key=date/date-time value={ Data:[] }
45328
+ this.GetKValue=ChartData.GetKValue;
45329
+
45081
45330
 
45082
45331
  this.BuildKey=function(item)
45083
45332
  {
@@ -45192,28 +45441,7 @@ function ChartMultiSVGIconV2()
45192
45441
 
45193
45442
  this.Canvas.restore();
45194
45443
  }
45195
-
45196
- this.GetKValue=function(kItem, valueName)
45197
- {
45198
- switch(valueName)
45199
- {
45200
- case "HIGH":
45201
- case "H":
45202
- return kItem.High;
45203
- case "L":
45204
- case "LOW":
45205
- return kItem.Low;
45206
- case "C":
45207
- case "CLOSE":
45208
- return kItem.Close;
45209
- case "O":
45210
- case "OPEN":
45211
- return KItem.Open;
45212
- default:
45213
- return null;
45214
- }
45215
- }
45216
-
45444
+
45217
45445
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
45218
45446
  {
45219
45447
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -61169,24 +61397,29 @@ function DynamicChartTitlePainting()
61169
61397
 
61170
61398
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
61171
61399
  {
61172
- if (!IFrameSplitOperator.IsNonEmptyArray(dataInfo.PointGroup)) return null;
61400
+ if (!dataInfo.GetItemCallback) return null;
61401
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61402
+ var kItem=dataInfo.Data.Data[dataIndex];
61403
+ if (!kItem) return null;
61404
+
61405
+ var group=dataInfo.GetItemCallback(kItem);
61406
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61173
61407
 
61174
61408
  var aryText=[];
61175
- for(var i=0;i<dataInfo.PointGroup.length;++i)
61409
+ for(var i=0;i<group.Data.length;++i)
61176
61410
  {
61177
- var groupItem=dataInfo.PointGroup[i];
61178
- for(var j=0;j<groupItem.Point.length;++j)
61179
- {
61180
- var item=groupItem.Point[j];
61181
- if (item.Index==dataIndex)
61182
- {
61183
- var item={ Text:item.Value.toFixed(2)};
61184
- if (aryText.length==0) item.Name=dataInfo.Name;
61185
- item.Color=groupItem.BGColor;
61186
- aryText.push(item);
61187
- break;
61188
- }
61189
- }
61411
+ var item=group.Data[i];
61412
+ var config=item.ColorConfig;
61413
+
61414
+ var color=null;
61415
+ if (config.BGColor) color=config.BGColor;
61416
+ else if (config.Color) color=config.Color;
61417
+
61418
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61419
+
61420
+ var value=item.Data.Value;
61421
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61422
+ aryText.push({ Text:this.FormatValue(value, dataInfo), Color:color});
61190
61423
  }
61191
61424
 
61192
61425
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -61957,6 +62190,11 @@ function DynamicChartTitlePainting()
61957
62190
  aryText=this.FromatStackedBarTitle(value, item);
61958
62191
  if (!aryText) continue;
61959
62192
  }
62193
+ else if (item.DataType=="ChartMultiPoint")
62194
+ {
62195
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
62196
+ if (!aryText) continue;
62197
+ }
61960
62198
  else
61961
62199
  {
61962
62200
  valueText=this.FormatValue(value,item);
@@ -74961,6 +75199,20 @@ function JSChartResource()
74961
75199
  Offset:{ X:-5, Y:5 }
74962
75200
  }
74963
75201
 
75202
+ this.ChartSimpleRadar=
75203
+ {
75204
+ TextFont:{ Family:'微软雅黑' , Size:12 },
75205
+ BorderColor:"rgb(169,169,169)",
75206
+ Offset:{ X:-5, Y:5 },
75207
+ TextColor:"rgb(105,105,105)",
75208
+ AryBGColor:['rgba(255,255,255,0.9)', 'rgba(230, 234, 242,0.9)'],
75209
+ AryArea:
75210
+ [
75211
+ { Color:"rgba(242,154,118,0.4)", LineColor:"rgb(242,154,118)"},
75212
+ { Color:"rgba(121,197,228,0.4)", LineColor:"rgb(92,165,196)"},
75213
+ ],
75214
+ }
75215
+
74964
75216
  //手机端tooltip
74965
75217
  this.TooltipPaint = {
74966
75218
  BGColor:'rgba(250,250,250,0.8)', //背景色
@@ -76192,6 +76444,7 @@ function JSChartResource()
76192
76444
 
76193
76445
  if (style.ChartSimpleTable) this.SetChartSimpleTable(style.ChartSimpleTable);
76194
76446
  if (style.ChartSimplePie) this.SetChartSimplePie(style.ChartSimplePie);
76447
+ if (style.ChartSimpleRadar) this.SetChartSimpleRadar(style.ChartSimpleRadar);
76195
76448
 
76196
76449
  if (style.DRAWICON)
76197
76450
  {
@@ -77285,6 +77538,30 @@ function JSChartResource()
77285
77538
  }
77286
77539
  }
77287
77540
 
77541
+ this.SetChartSimpleRadar=function(style)
77542
+ {
77543
+ var dest=this.ChartSimpleRadar;
77544
+ if (style.TextFont)
77545
+ {
77546
+ var item=style.TextFont;
77547
+ if (item.Name) dest.TextFont.Name=item.Name;
77548
+ if (IFrameSplitOperator.IsNumber(item.Size)) dest.TextFont.Size=item.Size;
77549
+ }
77550
+
77551
+ if (style.BorderColor) dest.BorderColor=style.BorderColor;
77552
+ if (style.TextColor) dest.TextColor=style.TextColor;
77553
+
77554
+ if (style.Offset)
77555
+ {
77556
+ var item=style.Offset;
77557
+ if (IFrameSplitOperator.IsNumber(item.X)) dest.Offset.X=item.X;
77558
+ if (IFrameSplitOperator.IsNumber(item.Y)) dest.Offset.Y=item.Y;
77559
+ }
77560
+
77561
+ if (IFrameSplitOperator.IsNonEmptyArray(style.AryBGColor)) dest.AryBGColor=style.AryBGColor.slice();
77562
+ if (IFrameSplitOperator.IsNonEmptyArray(style.AryArea)) dest.AryArea=style.AryArea.slice();
77563
+ }
77564
+
77288
77565
  }
77289
77566
 
77290
77567
  var g_JSChartResource=new JSChartResource();
@@ -83898,18 +84175,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
83898
84175
  {
83899
84176
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
83900
84177
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
83901
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
84178
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio}}, e);
83902
84179
 
83903
84180
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
83904
84181
  if (event)
83905
84182
  {
83906
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
84183
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, Point:{ X:x*pixelTatio, Y:y*pixelTatio}, CursorIndex:this.CursorIndex, };
83907
84184
  event.Callback(event,data,this);
83908
84185
  }
83909
84186
  }
83910
84187
 
83911
84188
  //右键菜单数据
83912
- this.GetRightMenuData=function(frameID)
84189
+ this.GetRightMenuData=function(frameID, option)
83913
84190
  {
83914
84191
  var windowCount=this.Frame.SubFrame.length; //窗口个数
83915
84192
  var klineChart=this.ChartPaint[0];
@@ -83952,6 +84229,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
83952
84229
  var bPopMinuteChart=false;
83953
84230
  if (this.PopMinuteChart) bPopMinuteChart=true;
83954
84231
 
84232
+ var kItem=null;
84233
+ if (frameID>=0 && option && IFrameSplitOperator.IsNumber(option.CursorIndex))
84234
+ {
84235
+ var kData=this.GetKData();
84236
+ if (kData && IFrameSplitOperator.IsNonEmptyArray(kData.Data))
84237
+ {
84238
+ var dataIndex=kData.DataOffset+option.CursorIndex;
84239
+ if (dataIndex>=0 && dataIndex<kData.Data.length) kItem=kData.Data[dataIndex];
84240
+ }
84241
+ }
84242
+
83955
84243
  var aryMenu=
83956
84244
  [
83957
84245
  {
@@ -84234,6 +84522,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84234
84522
  }
84235
84523
  }
84236
84524
  }
84525
+ else if (item.Name=="其他设置")
84526
+ {
84527
+ if (kItem)
84528
+ {
84529
+ var bLocked=this.IsLockCorssCursor();
84530
+ if (bLocked)
84531
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR }, Checked:bLocked });
84532
+ else
84533
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR, Args:[{ KItem:{Date:kItem.Date, Time:kItem.Time}, Draw:true }] }, Checked:bLocked });
84534
+ }
84535
+ }
84237
84536
  }
84238
84537
 
84239
84538
  return aryMenu;
@@ -85837,19 +86136,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
85837
86136
  if (option && option.Draw) this.Draw();
85838
86137
  }
85839
86138
 
86139
+ //option={ KItem:{ Date:, Time:}}
85840
86140
  this.LockCorssCursor=function(option)
85841
86141
  {
85842
- if (this.CursorIndex<0) return false;
85843
- var kData=this.GetKData();
85844
- if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86142
+ if (option && option.KItem) //指定日期时间
86143
+ {
86144
+ var kData=this.GetKData();
86145
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
85845
86146
 
85846
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
85847
- var kItem=kData.Data[dataIndex];
85848
- if (!kItem) return false;
86147
+ var kItem={ Date:option.KItem.Date, Time:option.KItem.Time, Index:-1};
86148
+ kData.FindDataIndexByDateTime([kItem]);
86149
+ if (kItem.Index<0) return false;
85849
86150
 
85850
- var xItem=this.GlobalOption.LockCorssCursor.X;
85851
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
85852
- xItem.Enable=true;
86151
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86152
+ xItem.KLine={ DataIndex:kItem.Index, Date:kItem.Date, Time:kItem.Time };
86153
+ xItem.Enable=true;
86154
+ }
86155
+ else
86156
+ {
86157
+ if (this.CursorIndex<0) return false;
86158
+ var kData=this.GetKData();
86159
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86160
+
86161
+ var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
86162
+ var kItem=kData.Data[dataIndex];
86163
+ if (!kItem) return false;
86164
+
86165
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86166
+ xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
86167
+ xItem.Enable=true;
86168
+ }
85853
86169
 
85854
86170
  if (option && option.Draw) this.Draw();
85855
86171
  return true;
@@ -85872,7 +86188,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
85872
86188
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
85873
86189
 
85874
86190
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
85875
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
86191
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
85876
86192
 
85877
86193
  var border=this.Frame.ChartBorder.GetBorder();
85878
86194
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -87945,18 +88261,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
87945
88261
  {
87946
88262
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
87947
88263
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
87948
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
88264
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} }, e);
87949
88265
 
87950
88266
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
87951
88267
  if (event)
87952
88268
  {
87953
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
88269
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} };
87954
88270
  event.Callback(event,data,this);
87955
88271
  }
87956
88272
  }
87957
88273
 
87958
88274
  //右键菜单数据
87959
- this.GetRightMenuData=function(frameID)
88275
+ this.GetRightMenuData=function(frameID, option)
87960
88276
  {
87961
88277
  var windowCount=this.Frame.SubFrame.length; //窗口个数
87962
88278
 
@@ -88083,11 +88399,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88083
88399
  }
88084
88400
 
88085
88401
 
88086
- //删除菜单
88402
+
88087
88403
  for(var i=0;i<aryMenu.length;++i)
88088
88404
  {
88089
88405
  var item=aryMenu[i];
88090
- if (item.Name=="叠加品种")
88406
+ if (item.Name=="叠加品种") //删除菜单
88091
88407
  {
88092
88408
  for(var j=0;j<item.SubMenu.length;++j)
88093
88409
  {
@@ -88099,6 +88415,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88099
88415
  }
88100
88416
  }
88101
88417
  }
88418
+ else if (item.Name=="其他设置")
88419
+ {
88420
+
88421
+ }
88102
88422
  }
88103
88423
 
88104
88424
  return aryMenu;
@@ -112491,6 +112811,48 @@ function JSDraw(errorHandler,symbolData)
112491
112811
 
112492
112812
  return result={ DrawData:{ Data:aryCell, Radius:radius }, DrawType:"DRAW_SIMPLE_PIE" };
112493
112813
  }
112814
+
112815
+ this.RADAR_CELL=function(name, data, max, min)
112816
+ {
112817
+ var cellItem={ Name:name, Max:100, Min:0, Value:null };
112818
+ if (IFrameSplitOperator.IsNumber(data))
112819
+ {
112820
+ cellItem.Value=data;
112821
+ }
112822
+ else if (IFrameSplitOperator.IsString(data))
112823
+ {
112824
+ cellItem.Value=parseFloat(data);
112825
+ }
112826
+ else if (IFrameSplitOperator.IsNonEmptyArray(data))
112827
+ {
112828
+ var lastValue=data[data.length-1];
112829
+ if (IFrameSplitOperator.IsNumber(lastValue)) cellItem.Value=lastValue;
112830
+ else if (IFrameSplitOperator.IsString(lastValue)) cellItem.Value=parseFloat(lastValue);
112831
+ }
112832
+
112833
+ if (IFrameSplitOperator.IsNumber(max)) cellItem.Max=max;
112834
+ if (IFrameSplitOperator.IsNumber(min)) cellItem.Min=min;
112835
+
112836
+ return cellItem;
112837
+ }
112838
+
112839
+ this.DRAWRADAR=function(args)
112840
+ {
112841
+ var radius=args[0];
112842
+ var color=args[1];
112843
+
112844
+ var aryIndex=[];
112845
+ var aryData=[];
112846
+ for(var i=2;i<args.length;++i)
112847
+ {
112848
+ var item=args[i];
112849
+
112850
+ aryIndex.push({ Name:item.Name, Max:item.Max, Min:item.Min });
112851
+ aryData.push({ Value:item.Value, Name:item.Name, Group:"Default"});
112852
+ }
112853
+
112854
+ return result={ DrawData:{ Data:aryData, AryIndex:aryIndex, Radius:radius, AryArea:[{ LineColor:color }] }, DrawType:"DRAW_SIMPLE_RADAR" };
112855
+ }
112494
112856
  }
112495
112857
 
112496
112858
 
@@ -112545,7 +112907,7 @@ JSDraw.prototype.IsDrawFunction=function(name)
112545
112907
  'DRAWOVERLAYLINE',"FILLRGN", "FILLRGN2","FILLTOPRGN", "FILLBOTTOMRGN", "FILLVERTICALRGN","FLOATRGN","DRAWSL", "DRAWGBK2","DRAWGBK_DIV",
112546
112908
  "VERTLINE","HORLINE","TIPICON",
112547
112909
  "BUY","SELL","SELLSHORT","BUYSHORT",
112548
- "DRAWLASTBARICON","DRAWLASTBARNUMBER", "DRAWLASTBARTEXT","DRAWTABLE","DRAWPIE",
112910
+ "DRAWLASTBARICON","DRAWLASTBARNUMBER", "DRAWLASTBARTEXT","DRAWTABLE","DRAWPIE","DRAWRADAR",
112549
112911
  ]);
112550
112912
  if (setFunctionName.has(name)) return true;
112551
112913
 
@@ -119434,6 +119796,14 @@ function JSExecute(ast,option)
119434
119796
  node.Draw=this.Draw.DRAWPIE(args);
119435
119797
  node.Out=[];
119436
119798
  break;
119799
+ //雷达图
119800
+ case "RADAR_CELL":
119801
+ node.Out=this.Draw.RADAR_CELL(args[0],args[1],args[2],args[3]);
119802
+ break;
119803
+ case "DRAWRADAR":
119804
+ node.Draw=this.Draw.DRAWRADAR(args);
119805
+ node.Out=[];
119806
+ break;
119437
119807
 
119438
119808
  default:
119439
119809
  node.Out=this.Algorithm.CallFunction(funcName, args, node, this.SymbolData);
@@ -122450,6 +122820,35 @@ function ScriptIndex(name,script,args,option)
122450
122820
  hqChart.ChartPaint.push(chart);
122451
122821
  }
122452
122822
 
122823
+ this.CreateSimpleRadar=function(hqChart,windowIndex,varItem,id)
122824
+ {
122825
+ var chart=new ChartSimpleRadar();
122826
+ chart.Canvas=hqChart.Canvas;
122827
+ chart.Name=varItem.Name;
122828
+ chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
122829
+ chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
122830
+
122831
+ if (varItem.Draw && varItem.Draw.DrawData)
122832
+ {
122833
+ var drawData=varItem.Draw.DrawData;
122834
+ if (drawData.Data) chart.Data.Data=drawData.Data;
122835
+ if (drawData.AryIndex) chart.AryIndex=drawData.AryIndex;
122836
+ if (IFrameSplitOperator.IsPlusNumber(drawData.Radius)) chart.Radius=drawData.Radius;
122837
+ if (drawData.BorderColor) chart.BorderColor=drawData.BorderColor;
122838
+
122839
+ if (drawData.TextFont) chart.TextFontConfig=drawData.TextFont;
122840
+ if (drawData.TextColor) chart.TextColor=drawData.TextColor;
122841
+ if (drawData.BorderColor) chart.BorderColor=drawData.BorderColor;
122842
+ if (IFrameSplitOperator.IsNumber(drawData.XOffset)) chart.Offset.X=drawData.XOffset;
122843
+ if (IFrameSplitOperator.IsNumber(drawData.YOffset)) chart.Offset.Y=drawData.YOffset;
122844
+ if (IFrameSplitOperator.IsNonEmptyArray(drawData.AryArea)) chart.AryAreaConfig=drawData.AryArea;
122845
+
122846
+ chart.BuildCacheData();
122847
+ }
122848
+
122849
+ hqChart.ChartPaint.push(chart);
122850
+ }
122851
+
122453
122852
  this.CreateTradeIcon=function(hqChart,windowIndex,varItem,id)
122454
122853
  {
122455
122854
  var chart=new ChartTradeIcon();
@@ -122824,16 +123223,18 @@ function ScriptIndex(name,script,args,option)
122824
123223
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
122825
123224
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
122826
123225
 
122827
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123226
+ chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
122828
123227
  chart.PointGroup=varItem.Draw.DrawData;
122829
123228
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123229
+ chart.BuildCacheData();
123230
+
122830
123231
  this.SetChartIndexName(chart);
122831
123232
  hqChart.ChartPaint.push(chart);
122832
123233
 
122833
- var titleIndex=windowIndex+1;
123234
+ var titleIndex=windowIndex+1;
122834
123235
  var titleData=new DynamicTitleData(chart.Data,chart.Name, null);
122835
123236
  titleData.DataType="ChartMultiPoint";
122836
- titleData.PointGroup=chart.PointGroup;
123237
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
122837
123238
  hqChart.TitlePaint[titleIndex].Data[i]=titleData;
122838
123239
  }
122839
123240
 
@@ -123325,6 +123726,10 @@ function ScriptIndex(name,script,args,option)
123325
123726
  break;
123326
123727
  case "DRAW_SIMPLE_PIE":
123327
123728
  this.CreateSimplePie(hqChart,windowIndex,item,i);
123729
+ break;
123730
+ case "DRAW_SIMPLE_RADAR":
123731
+ this.CreateSimpleRadar(hqChart,windowIndex,item,i);
123732
+ break;
123328
123733
  case "BUY":
123329
123734
  case "SELL":
123330
123735
  case "SELLSHORT":
@@ -123677,7 +124082,10 @@ function OverlayScriptIndex(name,script,args,option)
123677
124082
  break;
123678
124083
  case "DRAW_SIMPLE_PIE":
123679
124084
  this.CreateSimplePie(hqChart,windowIndex,item,i);
123680
-
124085
+ break;
124086
+ case "DRAW_SIMPLE_RADAR":
124087
+ this.CreateSimpleRadar(hqChart,windowIndex,item,i);
124088
+ break;
123681
124089
  case "KLINE_BG":
123682
124090
  this.CreateBackgroud(hqChart,windowIndex,item,i);
123683
124091
  break;
@@ -124541,7 +124949,7 @@ function OverlayScriptIndex(name,script,args,option)
124541
124949
  frame.ChartPaint.push(chart);
124542
124950
  }
124543
124951
 
124544
- this.CreateMultiPoint=function(hqChart,windowIndex,varItem,i)
124952
+ this.CreateMultiPoint=function(hqChart,windowIndex,varItem,id)
124545
124953
  {
124546
124954
  var overlayIndex=this.OverlayIndex;
124547
124955
  var frame=overlayIndex.Frame;
@@ -124554,6 +124962,17 @@ function OverlayScriptIndex(name,script,args,option)
124554
124962
 
124555
124963
  chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
124556
124964
  chart.PointGroup=varItem.Draw.DrawData;
124965
+ chart.BuildCacheData();
124966
+
124967
+ var titleIndex=windowIndex+1;
124968
+ var titlePaint=hqChart.TitlePaint[titleIndex];
124969
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
124970
+ titleData.DataType="ChartMultiPoint";
124971
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
124972
+ titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
124973
+
124974
+ this.SetChartIndexName(chart);
124975
+
124557
124976
  frame.ChartPaint.push(chart);
124558
124977
  }
124559
124978
 
@@ -124745,6 +125164,39 @@ function OverlayScriptIndex(name,script,args,option)
124745
125164
  frame.ChartPaint.push(chart);
124746
125165
  }
124747
125166
 
125167
+ this.CreateSimpleRadar=function(hqChart,windowIndex,varItem,id)
125168
+ {
125169
+ var overlayIndex=this.OverlayIndex;
125170
+ var frame=overlayIndex.Frame;
125171
+ var chart=new ChartSimpleRadar();
125172
+ chart.Canvas=hqChart.Canvas;
125173
+ chart.Name=varItem.Name;
125174
+ chart.ChartBorder=frame.Frame.ChartBorder;
125175
+ chart.ChartFrame=frame.Frame;
125176
+ chart.Identify=overlayIndex.Identify;
125177
+ chart.HQChart=hqChart;
125178
+
125179
+ if (varItem.Draw && varItem.Draw.DrawData)
125180
+ {
125181
+ var drawData=varItem.Draw.DrawData;
125182
+ if (drawData.Data) chart.Data.Data=drawData.Data;
125183
+ if (drawData.AryIndex) chart.AryIndex=drawData.AryIndex;
125184
+ if (IFrameSplitOperator.IsPlusNumber(drawData.Radius)) chart.Radius=drawData.Radius;
125185
+ if (drawData.BorderColor) chart.BorderColor=drawData.BorderColor;
125186
+
125187
+ if (drawData.TextFont) chart.TextFontConfig=drawData.TextFont;
125188
+ if (drawData.TextColor) chart.TextColor=drawData.TextColor;
125189
+ if (drawData.BorderColor) chart.BorderColor=drawData.BorderColor;
125190
+ if (IFrameSplitOperator.IsNumber(drawData.XOffset)) chart.Offset.X=drawData.XOffset;
125191
+ if (IFrameSplitOperator.IsNumber(drawData.YOffset)) chart.Offset.Y=drawData.YOffset;
125192
+ if (IFrameSplitOperator.IsNonEmptyArray(drawData.AryArea)) chart.AryAreaConfig=drawData.AryArea;
125193
+
125194
+ chart.BuildCacheData();
125195
+ }
125196
+
125197
+ frame.ChartPaint.push(chart);
125198
+ }
125199
+
124748
125200
  this.CreateChartVericaltLine=function(hqChart,windowIndex,varItem,id)
124749
125201
  {
124750
125202
  var overlayIndex=this.OverlayIndex;
@@ -125717,14 +126169,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125717
126169
  drawItem.Text=draw.Text;
125718
126170
  drawItem.Name=draw.Name;
125719
126171
  drawItem.DrawType=draw.DrawType;
125720
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
125721
- if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
125722
- {
125723
- for(var k=0; k<drawItem.DrawData.length; ++k)
125724
- {
125725
- this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
125726
- }
125727
- }
126172
+ drawItem.DrawData=draw.DrawData;
125728
126173
 
125729
126174
  outVarItem.Draw=drawItem;
125730
126175
  result.push(outVarItem);
@@ -125958,6 +126403,17 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125958
126403
  outVarItem.Draw=drawItem;
125959
126404
  result.push(outVarItem);
125960
126405
  }
126406
+ else if (draw.DrawType=="DRAW_SIMPLE_RADAR")
126407
+ {
126408
+ drawItem.Name=draw.Name;
126409
+ drawItem.Type=draw.Type;
126410
+
126411
+ drawItem.DrawType=draw.DrawType;
126412
+ drawItem.DrawData=draw.DrawData; //{ AryIndex:[ ], Data:[] };
126413
+
126414
+ outVarItem.Draw=drawItem;
126415
+ result.push(outVarItem);
126416
+ }
125961
126417
  else
125962
126418
  {
125963
126419
  var find=g_ScriptIndexChartFactory.Get(draw.DrawType); //外部挂接
@@ -126260,14 +126716,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126260
126716
  drawItem.Text=draw.Text;
126261
126717
  drawItem.Name=draw.Name;
126262
126718
  drawItem.DrawType=draw.DrawType;
126263
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126264
- if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
126265
- {
126266
- for(var k=0; k<drawItem.DrawData.length; ++k)
126267
- {
126268
- this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
126269
- }
126270
- }
126719
+ drawItem.DrawData=draw.DrawData;
126271
126720
 
126272
126721
  outVarItem.Draw=drawItem;
126273
126722
  result.push(outVarItem);
@@ -127574,6 +128023,20 @@ function GetBlackStyle()
127574
128023
  BorderColor:"rgb(220,220,220)",
127575
128024
  },
127576
128025
 
128026
+ ChartSimpleRadar:
128027
+ {
128028
+ //TextFont:{ Family:'微软雅黑' , Size:12 },
128029
+ BorderColor:"rgb(230, 230, 230)",
128030
+ //Offset:{ X:-5, Y:5 },
128031
+ TextColor:"rgb(250, 250, 250)",
128032
+ AryBGColor:['rgba(63,61,82,0.9)','rgba(56,55,80,0.9)'],
128033
+ AryArea:
128034
+ [
128035
+ { Color:"rgba(242,154,118,0.4)", LineColor:"rgb(242,154,118)"},
128036
+ { Color:"rgba(121,197,228,0.4)", LineColor:"rgb(92,165,196)"},
128037
+ ],
128038
+ },
128039
+
127577
128040
  ChartDrawVolProfile:
127578
128041
  {
127579
128042
  BGColor:"rgba(244,250,254,0.3)",
@@ -142109,7 +142572,7 @@ function ScrollBarBGChart()
142109
142572
 
142110
142573
 
142111
142574
 
142112
- var HQCHART_VERSION="1.1.14319";
142575
+ var HQCHART_VERSION="1.1.14335";
142113
142576
 
142114
142577
  function PrintHQChartVersion()
142115
142578
  {