hqchart 1.1.12375 → 1.1.12382

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.
@@ -2398,7 +2398,7 @@ if(this.CloseIndex&&this.Identify!==0)aryButton.push({ID:JSCHART_BUTTON_ID.CLOSE
2398
2398
  for(var i=0;i<this.CustomToolbar.length;++i){var item=this.CustomToolbar[i];if(item.ID&&item.Style){var btnItem={ID:item.ID,Style:item.Style,TooltipText:item.TooltipText};if(item.IsLeft===true)aryLeftButton.push(btnItem);//左侧按钮
2399
2399
  }}return aryLeftButton;};this.DrawFrame=function(){if(!this.IsMinSize){this.SplitXYCoordinate();if(this.SizeChange==true){this.CalculateDataWidth();if(this.Logarithmic)this.SplitLogarithmicXYCoordinate();}if(this.BeforeDrawXYCallback)this.BeforeDrawXYCallback(this);this.DrawTitleBG();this.DrawHorizontal();this.DrawVertical();}if(this.SizeChange==true||this.ReDrawToolbar==true){this.DrawToolbar();//大小变动才画工具条
2400
2400
  this.ReDrawToolbar=false;}};//isLimit 是否限制在当前屏坐标下
2401
- this.GetXFromIndex=function(index,isLimit){if(isLimit===false){if(index>=0){var offset=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin+this.DistanceWidth/2+this.DataWidth/2;for(var i=1;i<=index;++i){offset+=this.DistanceWidth+this.DataWidth;}}else{var offset=this.ChartBorder.GetLeft()-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);var absIndex=Math.abs(index);for(var i=1;i<absIndex;++i){offset-=this.DistanceWidth+this.DataWidth;}}}else{if(index<0)index=0;if(index>this.xPointCount-1)index=this.xPointCount-1;var offset=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin+this.DistanceWidth/2+this.DataWidth/2;for(var i=1;i<=index;++i){offset+=this.DistanceWidth+this.DataWidth;}}return offset;};//X坐标转x轴数值 isLimit=是否限制在当前屏坐标下
2401
+ this.GetXFromIndex=function(index,isLimit){if(isLimit===false){if(index>=0){var offset=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin+this.DistanceWidth/2+this.DataWidth/2;for(var i=1;i<=index;++i){offset+=this.DistanceWidth+this.DataWidth;}}else{var offset=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);var absIndex=Math.abs(index);for(var i=1;i<absIndex;++i){offset-=this.DistanceWidth+this.DataWidth;}}}else{if(index<0)index=0;if(index>this.xPointCount-1)index=this.xPointCount-1;var offset=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin+this.DistanceWidth/2+this.DataWidth/2;for(var i=1;i<=index;++i){offset+=this.DistanceWidth+this.DataWidth;}}return offset;};//X坐标转x轴数值 isLimit=是否限制在当前屏坐标下
2402
2402
  this.GetXData=function(x,isLimit){var distanceWidth=this.DistanceWidth;var dataWidth=this.DataWidth;var left=this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin;if(isLimit==false){if(x<this.ChartBorder.GetLeft()){var index=-1;var xPoint=this.ChartBorder.GetLeft()-(distanceWidth/2+dataWidth+distanceWidth);while(index>-10000){if(xPoint<=x)break;xPoint-=dataWidth+distanceWidth;--index;}return index;}else{var index=0;var xPoint=left+distanceWidth/2+dataWidth+distanceWidth;while(index<10000)//自己算x的数值
2403
2403
  {if(xPoint>=x)break;xPoint+=dataWidth+distanceWidth;++index;}return index;}}else{if(x<=this.ChartBorder.GetLeft())return 0;if(x>=this.ChartBorder.GetRight())return this.XPointCount-1;var right=this.ChartBorder.GetRight()-g_JSChartResource.FrameRightMargin;var index=0;var xPoint=left+distanceWidth/2+dataWidth+distanceWidth;while(xPoint<right&&index<10000&&index+1<this.XPointCount)//自己算x的数值
2404
2404
  {if(xPoint>=x)break;xPoint+=dataWidth+distanceWidth;++index;}//var test=(x-this.ChartBorder.GetLeft())*(this.XPointCount*1.0/this.ChartBorder.GetWidth());
@@ -4096,11 +4096,12 @@ this.ArrawAngle=35;//三角斜边一直线夹角
4096
4096
  this.ArrawLength=10;//三角斜边长度
4097
4097
  this.ArrawLineWidth=5;//箭头粗细
4098
4098
  this.Arrow={Start:false,End:false};//Start=是否绘制开始箭头 <- End=是否绘制结束箭头 ->
4099
- this.Draw=function(){if(!this.IsShow||this.ChartFrame.IsMinSize)return;if(!this.Data||this.Data.length<=0)return;this.IsHScreen=this.ChartFrame.IsHScreen===true;var xPointCount=this.ChartFrame.XPointCount;var offset=this.Data.DataOffset;var drawLines=[];var arrowLines=[];for(var i in this.Lines){var line=this.Lines[i];var drawPoints={Point:[],Color:line.Color};var drawArrowPoints={Start:[],End:[]};if(line.BGColor)drawPoints.BGColor=line.BGColor;for(var j=0;j<line.Point.length;++j){var point=line.Point[j];if(!IFrameSplitOperator.IsNumber(point.Index))continue;var index=point.Index-offset;if(index>=0&&index<xPointCount){var x=this.ChartFrame.GetXFromIndex(index);var y=this.ChartFrame.GetYFromData(point.Value,false);var pointItem={X:x,Y:y,End:false};drawPoints.Point.push(pointItem);if(j==0||j==1)drawArrowPoints.Start.push(pointItem);//起始点
4099
+ this.Draw=function(){if(!this.IsShow||this.ChartFrame.IsMinSize)return;if(!this.Data||this.Data.length<=0)return;if(!IFrameSplitOperator.IsNonEmptyArray(this.Lines))return;this.IsHScreen=this.ChartFrame.IsHScreen===true;var xPointCount=this.ChartFrame.XPointCount;var offset=this.Data.DataOffset;var drawLines=[];var arrowLines=[];for(var i=0;i<this.Lines.length;++i){var line=this.Lines[i];var drawPoints={Point:[],Color:line.Color};var drawArrowPoints={Start:[],End:[]};if(line.BGColor)drawPoints.BGColor=line.BGColor;var isExtendLine=false;if(IFrameSplitOperator.IsBool(line.IsExtendLine))isExtendLine=line.IsExtendLine;if(isExtendLine)//左右延申
4100
+ {var prePoint=null;var bFirstPoint=true;for(var j=0;j<line.Point.length;++j){var point=line.Point[j];if(!IFrameSplitOperator.IsNumber(point.Index))continue;var index=point.Index-offset;if(index>0&&index<xPointCount){if(bFirstPoint){if(prePoint){var preIndex=prePoint.Index-offset;var x=this.ChartFrame.GetXFromIndex(preIndex,false);var y=this.ChartFrame.GetYFromData(prePoint.Value,false);var pointItem={X:x,Y:y,End:false};drawPoints.Point.push(pointItem);}bFirstPoint=false;}var x=this.ChartFrame.GetXFromIndex(index,false);var y=this.ChartFrame.GetYFromData(point.Value,false);var pointItem={X:x,Y:y,End:false};drawPoints.Point.push(pointItem);}else{if(drawPoints.Point.length>0){var x=this.ChartFrame.GetXFromIndex(index,false);var y=this.ChartFrame.GetYFromData(point.Value,false);var pointItem={X:x,Y:y,End:true};drawPoints.Point.push(pointItem);bFirstPoint=true;prePoint=null;}}prePoint=point;}if(drawPoints.Point.length>=2){drawLines.push(drawPoints);arrowLines.push(drawArrowPoints);}}else{for(var j=0;j<line.Point.length;++j){var point=line.Point[j];if(!IFrameSplitOperator.IsNumber(point.Index))continue;var index=point.Index-offset;if(index>=0&&index<xPointCount){var x=this.ChartFrame.GetXFromIndex(index);var y=this.ChartFrame.GetYFromData(point.Value,false);var pointItem={X:x,Y:y,End:false};drawPoints.Point.push(pointItem);if(j==0||j==1)drawArrowPoints.Start.push(pointItem);//起始点
4100
4101
  if(j==line.Point.length-1||j==line.Point.length-2)drawArrowPoints.End.push(pointItem);//结束点
4101
4102
  }else{if(drawPoints.Point.length>0)drawPoints.Point[drawPoints.Point.length-1].End=true;//点断开
4102
- }}if(drawPoints.Point.length>=2){drawLines.push(drawPoints);arrowLines.push(drawArrowPoints);}}var pixelRatio=GetDevicePixelRatio();this.Canvas.save();for(var i in drawLines){if(this.LineDash)this.Canvas.setLineDash(this.LineDash);if(IFrameSplitOperator.IsPlusNumber(this.LineWidth))this.Canvas.lineWidth=this.LineWidth*pixelRatio;else this.Canvas.lineWidth=1*pixelRatio;var item=drawLines[i];this.DrawLine(item,arrowLines[i]);}this.Canvas.restore();};this.DrawLine=function(line,arrow){if(line.BGColor)//背景色
4103
- {this.Canvas.fillStyle=line.BGColor;for(var i in line.Point){var item=line.Point[i];if(i==0){this.Canvas.beginPath();if(this.IsHScreen)this.Canvas.moveTo(item.Y,item.X);else this.Canvas.moveTo(item.X,item.Y);}else{if(this.IsHScreen)this.Canvas.lineTo(item.Y,item.X);else this.Canvas.lineTo(item.X,item.Y);}}this.Canvas.closePath();this.Canvas.fill();}this.Canvas.strokeStyle=line.Color;var drawCount=0;for(var i in line.Point){var item=line.Point[i];if(drawCount==0){this.Canvas.beginPath();if(this.IsHScreen)this.Canvas.moveTo(item.Y,item.X);else this.Canvas.moveTo(item.X,item.Y);++drawCount;}else{if(this.IsHScreen)this.Canvas.lineTo(item.Y,item.X);else this.Canvas.lineTo(item.X,item.Y);++drawCount;}if(item.End==true)//点断了 要重新画
4103
+ }}if(drawPoints.Point.length>=2){drawLines.push(drawPoints);arrowLines.push(drawArrowPoints);}}}var pixelRatio=GetDevicePixelRatio();this.Canvas.save();this.ClipClient(this.IsHScreen);for(var i=0;i<drawLines.length;++i){if(this.LineDash)this.Canvas.setLineDash(this.LineDash);if(IFrameSplitOperator.IsPlusNumber(this.LineWidth))this.Canvas.lineWidth=this.LineWidth*pixelRatio;else this.Canvas.lineWidth=1*pixelRatio;var item=drawLines[i];this.DrawLine(item,arrowLines[i]);}this.Canvas.restore();};this.DrawLine=function(line,arrow){if(line.BGColor)//背景色
4104
+ {this.Canvas.fillStyle=line.BGColor;for(var i=0;i<line.Point.length;++i){var item=line.Point[i];if(i==0){this.Canvas.beginPath();if(this.IsHScreen)this.Canvas.moveTo(item.Y,item.X);else this.Canvas.moveTo(item.X,item.Y);}else{if(this.IsHScreen)this.Canvas.lineTo(item.Y,item.X);else this.Canvas.lineTo(item.X,item.Y);}}this.Canvas.closePath();this.Canvas.fill();}this.Canvas.strokeStyle=line.Color;var drawCount=0;for(var i=0;i<line.Point.length;++i){var item=line.Point[i];if(drawCount==0){this.Canvas.beginPath();if(this.IsHScreen)this.Canvas.moveTo(item.Y,item.X);else this.Canvas.moveTo(item.X,item.Y);++drawCount;}else{if(this.IsHScreen)this.Canvas.lineTo(item.Y,item.X);else this.Canvas.lineTo(item.X,item.Y);++drawCount;}if(item.End==true)//点断了 要重新画
4104
4105
  {if(drawCount>0)this.Canvas.stroke();drawCount=0;}}if(drawCount>0)this.Canvas.stroke();//绘制箭头
4105
4106
  if(arrow.End.length==2&&this.Arrow.End==true)this.DrawArrow(arrow.End[0],arrow.End[1]);if(arrow.Start.length==2&&this.Arrow.Start==true)this.DrawArrow(arrow.Start[1],arrow.Start[0]);};this.DrawArrow=function(ptStart,ptEnd){//计算箭头
4106
4107
  var theta=this.ArrawAngle;//三角斜边一直线夹角
@@ -4143,7 +4144,9 @@ this.newMethod();delete this.newMethod;this.ClassName="ChartDrawSVG";this.Family
4143
4144
  this.IsHScreen=false;//是否横屏
4144
4145
  this.IsDestroy=false;//是否已销毁
4145
4146
  this.EnableTooltip=true;this.TooltipRect=[];//this.Data; 存K线数据
4146
- this.Draw=function(){this.TooltipRect=[];if(!this.IsShow||this.ChartFrame.IsMinSize||!this.IsVisible)return;if(this.IsShowIndexTitleOnly())return;if(this.IsHideScriptIndex())return;this.DrawSVG();};this.DrawDetail=function(rtSVG,data){if(!IFrameSplitOperator.IsNonEmptyArray(data.Content))return;var lefMargin=2;var rightMargin=2;var itemSpace=2;var rtBorder={Left:rtSVG.Right,Right:rtSVG.Right,Bottom:rtSVG.Bottom};if(IFrameSplitOperator.IsNumber(data.ItemSpace))itemSpace=data.ItemSpace;if(IFrameSplitOperator.IsNumber(data.YOffset))rtBorder.Bottom+=data.YOffset;if(IFrameSplitOperator.IsNumber(data.XOffset))rtBorder.Left+=data.XOffset;if(IFrameSplitOperator.IsNumber(data.LeftMargin))lefMargin=data.LeftMargin;if(IFrameSplitOperator.IsNumber(data.RightMargin))rightMargin=data.RightMargin;if(data.Font)this.Canvas.font=data.Font;else this.Canvas.font=this.TextFont;this.Canvas.textBaseline='bottom';this.Canvas.textAlign='left';var textHeight=this.Canvas.measureText("擎").width+2;rtBorder.Height=textHeight+5;var yText=rtBorder.Bottom-(rtBorder.Height-textHeight)/2;var xText=rtBorder.Left+lefMargin;var aryText=[];for(var i=0;i<data.Content.length;++i){if(aryText.length>0)xText+=itemSpace;var item=data.Content[i];if(!item.Text)continue;var textWidth=this.Canvas.measureText(item.Text).width+2;aryText.push({X:xText,Y:yText,Width:textWidth,Data:item});xText+=textWidth;rtBorder.Right=xText;}rtBorder.Right+=rightMargin;rtBorder.Width=rtBorder.Right-rtBorder.Left;rtBorder.Top=rtBorder.Bottom-rtBorder.Height;if(data.BGColor){this.Canvas.fillStyle=data.BGColor;this.Canvas.fillRect(rtBorder.Left,rtBorder.Top,rtBorder.Width,rtBorder.Height);}if(data.BorderColor){this.Canvas.strokeStyle=data.BorderColor;this.Canvas.strokeRect(ToFixedPoint(rtBorder.Left),ToFixedPoint(rtBorder.Top),ToFixedRect(rtBorder.Width),ToFixedRect(rtBorder.Height));}for(var i=0;i<aryText.length;++i){var item=aryText[i];this.Canvas.fillStyle=item.Data.Color;this.Canvas.fillText(item.Data.Text,item.X,item.Y);}};this.DrawSVG=function(){if(!this.IsShow||this.ChartFrame.IsMinSize)return;if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return;if(!IFrameSplitOperator.IsNonEmptyArray(this.Texts))return;if(!this.Family)return;this.IsHScreen=this.ChartFrame.IsHScreen===true;var xPointCount=this.ChartFrame.XPointCount;var offset=this.Data.DataOffset;var top=this.ChartBorder.GetTopEx();var bottom=this.ChartBorder.GetBottomEx();var pixelRatio=GetDevicePixelRatio();var x=0,y=0;for(var i=0;i<this.Texts.length;++i){var item=this.Texts[i];if(!item.SVG||!item.SVG.Symbol)continue;if(!IFrameSplitOperator.IsNumber(item.Index))continue;var isMinuteFrame=this.IsMinuteFrame();var index=item.Index-offset;var kItem=this.Data.Data[item.Index];if(index<0||index>=xPointCount)continue;x=this.ChartFrame.GetXFromIndex(index);if(item.Value=="Top")y=top;else if(item.Value=="Bottom")y=bottom;else y=this.ChartFrame.GetYFromData(item.Value);if(IFrameSplitOperator.IsNumber(item.YOffset))y+=item.YOffset;//Y轴偏移
4147
+ this.Draw=function(){this.TooltipRect=[];if(!this.IsShow||this.ChartFrame.IsMinSize||!this.IsVisible)return;if(this.IsShowIndexTitleOnly())return;if(this.IsHideScriptIndex())return;this.DrawSVG();};this.DrawDetail=function(rtSVG,data){if(!IFrameSplitOperator.IsNonEmptyArray(data.Content))return;var lefMargin=2;var rightMargin=2;var itemSpace=2;var rtBorder={Left:rtSVG.Right,Right:rtSVG.Right,Bottom:rtSVG.Bottom};var rightBorder=0;//右边的边界 0=div的宽度 1=图形框架边框
4148
+ if(IFrameSplitOperator.IsNumber(data.ItemSpace))itemSpace=data.ItemSpace;if(IFrameSplitOperator.IsNumber(data.YOffset))rtBorder.Bottom+=data.YOffset;if(IFrameSplitOperator.IsNumber(data.XOffset))rtBorder.Left+=data.XOffset;if(IFrameSplitOperator.IsNumber(data.LeftMargin))lefMargin=data.LeftMargin;if(IFrameSplitOperator.IsNumber(data.RightMargin))rightMargin=data.RightMargin;if(IFrameSplitOperator.IsNumber(data.RightBorder))rightBorder=data.RightBorder;if(data.Font)this.Canvas.font=data.Font;else this.Canvas.font=this.TextFont;this.Canvas.textBaseline='bottom';this.Canvas.textAlign='left';var textHeight=this.Canvas.measureText("擎").width+2;rtBorder.Height=textHeight+5;var yText=rtBorder.Bottom-(rtBorder.Height-textHeight)/2;var xText=rtBorder.Left+lefMargin;var aryText=[];for(var i=0;i<data.Content.length;++i){if(aryText.length>0)xText+=itemSpace;var item=data.Content[i];if(!item.Text)continue;var textWidth=this.Canvas.measureText(item.Text).width+2;aryText.push({X:xText,Y:yText,Width:textWidth,Data:item});xText+=textWidth;rtBorder.Right=xText;}rtBorder.Right+=rightMargin;rtBorder.Width=rtBorder.Right-rtBorder.Left;rtBorder.Top=rtBorder.Bottom-rtBorder.Height;var right=this.ChartBorder.GetChartWidth()-1;if(rightBorder==1)right=this.ChartBorder.GetRight();if(rtBorder.Right>right)//右边显示不下,显示在左边
4149
+ {rtBorder.Right=rtSVG.Left;if(IFrameSplitOperator.IsNumber(data.XOffset))rtBorder.Right-=data.XOffset;rtBorder.Left=rtBorder.Right-rtBorder.Width;var xText=rtBorder.Left+lefMargin;for(var i=0;i<aryText.length;++i){if(i>0)xText+=itemSpace;var item=aryText[i];item.X=xText;xText+=item.Width;}}if(data.BGColor){this.Canvas.fillStyle=data.BGColor;this.Canvas.fillRect(rtBorder.Left,rtBorder.Top,rtBorder.Width,rtBorder.Height);}if(data.BorderColor){this.Canvas.strokeStyle=data.BorderColor;this.Canvas.strokeRect(ToFixedPoint(rtBorder.Left),ToFixedPoint(rtBorder.Top),ToFixedRect(rtBorder.Width),ToFixedRect(rtBorder.Height));}for(var i=0;i<aryText.length;++i){var item=aryText[i];this.Canvas.fillStyle=item.Data.Color;this.Canvas.fillText(item.Data.Text,item.X,item.Y);}};this.DrawSVG=function(){if(!this.IsShow||this.ChartFrame.IsMinSize)return;if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return;if(!IFrameSplitOperator.IsNonEmptyArray(this.Texts))return;if(!this.Family)return;this.IsHScreen=this.ChartFrame.IsHScreen===true;var xPointCount=this.ChartFrame.XPointCount;var offset=this.Data.DataOffset;var top=this.ChartBorder.GetTopEx();var bottom=this.ChartBorder.GetBottomEx();var pixelRatio=GetDevicePixelRatio();var x=0,y=0;for(var i=0;i<this.Texts.length;++i){var item=this.Texts[i];if(!item.SVG||!item.SVG.Symbol)continue;if(!IFrameSplitOperator.IsNumber(item.Index))continue;var isMinuteFrame=this.IsMinuteFrame();var index=item.Index-offset;var kItem=this.Data.Data[item.Index];if(index<0||index>=xPointCount)continue;x=this.ChartFrame.GetXFromIndex(index);if(item.Value=="Top")y=top;else if(item.Value=="Bottom")y=bottom;else y=this.ChartFrame.GetYFromData(item.Value);if(IFrameSplitOperator.IsNumber(item.YOffset))y+=item.YOffset;//Y轴偏移
4147
4150
  var svgItem=item.SVG;if(IFrameSplitOperator.IsNumber(svgItem.YOffset))y+=svgItem.YOffset;var fontSVG=svgItem.Size+'px '+this.Family;this.Canvas.font=fontSVG;var halfSize=svgItem.Size/2;var textBaseline='bottom';var rtSVG={Left:x-halfSize,Right:x+halfSize,Top:y-svgItem.Size,Bottom:y,Height:svgItem.Size,Width:svgItem.Size};if(svgItem.VAlign===0){textBaseline="top";rtSVG.Top=y;rtSVG.Bottom=rtSVG.Top+svgItem.Size;}else if(svgItem.VAlign===1){textBaseline='middle';rtSVG.Top=y-svgItem.Size/2;rtSVG.Bottom=rtSVG.Top+svgItem.Size;}if(rtSVG.Top<0){rtSVG.Top=0;rtSVG.Bottom=svgItem.Size;y=rtSVG.Bottom;}this.Canvas.textBaseline=textBaseline;this.Canvas.textAlign='center';this.Canvas.fillStyle=svgItem.Color;this.Canvas.fillText(svgItem.Symbol,x,y);if(this.EnableTooltip)this.TooltipRect.push({Rect:rtSVG,Index:i});//文字
4148
4151
  if(item.Text&&item.Text.Content&&this.TextFont){var textItem=item.Text;this.Canvas.font=this.TextFont;this.Canvas.fillStyle=textItem.Color;var yText=y;if(IFrameSplitOperator.IsNumber(textItem.YOffset))yText+=textItem.YOffset;this.Canvas.fillText(textItem.Content,x,yText);}if(item.Detail){this.DrawDetail(rtSVG,item.Detail);}//连线
4149
4152
  if(item.Line){var lineItem=item.Line;var price;var kItem=this.Data.Data[item.Index];switch(lineItem.Value){case"C":price=kItem.Close;break;case"H":price=kItem.High;break;case"L":price=kItem.Low;break;}if(!IFrameSplitOperator.IsNumber(price))continue;var yPrice=this.ChartFrame.GetYFromData(price);if(yPrice>=rtSVG.Top&&yPrice<=rtSVG.Bottom)continue;var yText;if(yPrice<rtSVG.Top){yText=rtSVG.Top;if(IFrameSplitOperator.IsNumber(lineItem.SVGBlank)){//yPrice+=lineItem.Blank;
@@ -12558,7 +12561,7 @@ this.AreaColor=g_JSChartResource.ScrollBar.BGChart.AreaColor;//面积图颜色
12558
12561
  };this.Draw=function(){if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return;this.Canvas.save();if(this.LineWidth>0)this.Canvas.lineWidth=this.LineWidth*GetDevicePixelRatio();var bottom=this.ChartBorder.GetBottom();this.Canvas.strokeStyle=this.Color;var bFirstPoint=true;var drawCount=0,x,y;var firstPoint={};for(var i=0;i<this.Data.Data.length;++i){var item=this.Data.Data[i];var value=item.Close;if(!IFrameSplitOperator.IsNumber(value))continue;x=this.ChartFrame.GetXFromIndex(i);y=this.ChartFrame.GetYFromData(value);if(bFirstPoint){this.Canvas.beginPath();this.Canvas.moveTo(x,y);bFirstPoint=false;firstPoint={X:x,Y:y};}else{this.Canvas.lineTo(x,y);}++drawCount;}if(drawCount>0){this.Canvas.stroke();this.Canvas.lineTo(x,bottom);this.Canvas.lineTo(firstPoint.X,bottom);this.Canvas.closePath();this.Canvas.fillStyle=this.AreaColor;this.Canvas.fill();}this.Canvas.restore();};this.GetMaxMin=function(){var range={Max:null,Min:null};if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return range;for(var i=0;i<this.Data.Data.length;++i){var item=this.Data.Data[i];var value=item.Close;if(!IFrameSplitOperator.IsNumber(value))continue;if(range.Max==null||range.Max<value)range.Max=value;if(range.Min==null||range.Min>value)range.Min=value;}return range;};}/********************************************************************************
12559
12562
  * 版本信息输出
12560
12563
  *
12561
- */var HQCHART_VERSION="1.1.12374";function PrintHQChartVersion(){var log='*************************************************************************************************************\n*\n* HQChart Ver: '+HQCHART_VERSION+' \n* \n* License: Apache License 2.0 \n* Source: https://github.com/jones2000/HQChart\n*\n*************************************************************************************************************\n';console.log(log);}PrintHQChartVersion();//把给外界调用的方法暴露出来
12564
+ */var HQCHART_VERSION="1.1.12381";function PrintHQChartVersion(){var log='*************************************************************************************************************\n*\n* HQChart Ver: '+HQCHART_VERSION+' \n* \n* License: Apache License 2.0 \n* Source: https://github.com/jones2000/HQChart\n*\n*************************************************************************************************************\n';console.log(log);}PrintHQChartVersion();//把给外界调用的方法暴露出来
12562
12565
  exports.default=(_jsChartInit$jsChartS={jsChartInit:JSChart.Init,jsChartStyle:JSChart.SetStyle,// IsIndexSymbol:IsIndexSymbol,
12563
12566
  // BaseIndex:BaseIndex,
12564
12567
  // ChartLine:ChartLine,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "hqchart",
3
3
  "description": "stock chart",
4
4
  "author": "jones2000",
5
- "version": "1.1.12375",
5
+ "version": "1.1.12382",
6
6
  "main": "lib/main.js",
7
7
  "private": false,
8
8
  "license": "Apache License 2.0",
@@ -13289,7 +13289,7 @@ function KLineFrame()
13289
13289
  }
13290
13290
  else
13291
13291
  {
13292
- var offset=this.ChartBorder.GetLeft()-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);
13292
+ var offset=(this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin)-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);
13293
13293
  var absIndex=Math.abs(index);
13294
13294
  for(var i=1;i<absIndex;++i)
13295
13295
  {
@@ -34031,6 +34031,7 @@ function ChartMultiLine()
34031
34031
  {
34032
34032
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
34033
34033
  if (!this.Data || this.Data.length<=0) return;
34034
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Lines)) return;
34034
34035
 
34035
34036
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
34036
34037
  var xPointCount=this.ChartFrame.XPointCount;
@@ -34038,44 +34039,108 @@ function ChartMultiLine()
34038
34039
 
34039
34040
  var drawLines=[];
34040
34041
  var arrowLines=[];
34041
- for(var i in this.Lines)
34042
+ for(var i=0; i<this.Lines.length; ++i)
34042
34043
  {
34043
34044
  var line=this.Lines[i];
34044
34045
  var drawPoints={ Point:[], Color:line.Color };
34045
34046
  var drawArrowPoints={ Start:[], End:[] };
34046
34047
  if (line.BGColor) drawPoints.BGColor=line.BGColor;
34047
- for(var j=0; j<line.Point.length; ++j)
34048
+ var isExtendLine=false;
34049
+ if (IFrameSplitOperator.IsBool(line.IsExtendLine)) isExtendLine=line.IsExtendLine;
34050
+ if (isExtendLine) //左右延申
34048
34051
  {
34049
- var point=line.Point[j];
34050
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
34051
-
34052
- var index=point.Index-offset;
34053
- if (index>=0 && index<xPointCount)
34052
+ var prePoint=null;
34053
+ var bFirstPoint=true;
34054
+ for(var j=0; j<line.Point.length; ++j)
34054
34055
  {
34055
- var x=this.ChartFrame.GetXFromIndex(index);
34056
- var y=this.ChartFrame.GetYFromData(point.Value, false);
34057
- var pointItem={X:x, Y:y, End:false};
34058
- drawPoints.Point.push(pointItem);
34056
+ var point=line.Point[j];
34057
+ if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
34058
+
34059
+ var index=point.Index-offset;
34060
+ if (index>0 && index<xPointCount)
34061
+ {
34062
+ if (bFirstPoint)
34063
+ {
34064
+ if (prePoint)
34065
+ {
34066
+ var preIndex=prePoint.Index-offset;
34067
+
34068
+ var x=this.ChartFrame.GetXFromIndex(preIndex, false);
34069
+ var y=this.ChartFrame.GetYFromData(prePoint.Value, false);
34070
+
34071
+ var pointItem={X:x, Y:y, End:false};
34072
+ drawPoints.Point.push(pointItem);
34073
+ }
34074
+
34075
+ bFirstPoint=false;
34076
+ }
34077
+
34078
+ var x=this.ChartFrame.GetXFromIndex(index, false);
34079
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
34080
+
34081
+ var pointItem={X:x, Y:y, End:false};
34082
+ drawPoints.Point.push(pointItem);
34083
+ }
34084
+ else
34085
+ {
34086
+ if (drawPoints.Point.length>0)
34087
+ {
34088
+ var x=this.ChartFrame.GetXFromIndex(index, false);
34089
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
34090
+
34091
+ var pointItem={X:x, Y:y, End:true};
34092
+ drawPoints.Point.push(pointItem);
34093
+
34094
+ bFirstPoint=true;
34095
+ prePoint=null;
34096
+ }
34097
+ }
34059
34098
 
34060
- if (j==0 || j==1) drawArrowPoints.Start.push(pointItem); //起始点
34061
- if (j==line.Point.length-1 || j==line.Point.length-2) drawArrowPoints.End.push(pointItem); //结束点
34099
+ prePoint=point;
34062
34100
  }
34063
- else
34101
+
34102
+ if (drawPoints.Point.length>=2)
34064
34103
  {
34065
- if (drawPoints.Point.length>0) drawPoints.Point[drawPoints.Point.length-1].End=true; //点断开
34104
+ drawLines.push(drawPoints);
34105
+ arrowLines.push(drawArrowPoints);
34066
34106
  }
34067
34107
  }
34068
-
34069
- if (drawPoints.Point.length>=2)
34108
+ else
34070
34109
  {
34071
- drawLines.push(drawPoints);
34072
- arrowLines.push(drawArrowPoints);
34110
+ for(var j=0; j<line.Point.length; ++j)
34111
+ {
34112
+ var point=line.Point[j];
34113
+ if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
34114
+
34115
+ var index=point.Index-offset;
34116
+ if (index>=0 && index<xPointCount)
34117
+ {
34118
+ var x=this.ChartFrame.GetXFromIndex(index);
34119
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
34120
+ var pointItem={X:x, Y:y, End:false};
34121
+ drawPoints.Point.push(pointItem);
34122
+
34123
+ if (j==0 || j==1) drawArrowPoints.Start.push(pointItem); //起始点
34124
+ if (j==line.Point.length-1 || j==line.Point.length-2) drawArrowPoints.End.push(pointItem); //结束点
34125
+ }
34126
+ else
34127
+ {
34128
+ if (drawPoints.Point.length>0) drawPoints.Point[drawPoints.Point.length-1].End=true; //点断开
34129
+ }
34130
+ }
34131
+
34132
+ if (drawPoints.Point.length>=2)
34133
+ {
34134
+ drawLines.push(drawPoints);
34135
+ arrowLines.push(drawArrowPoints);
34136
+ }
34073
34137
  }
34074
34138
  }
34075
34139
 
34076
34140
  var pixelRatio=GetDevicePixelRatio();
34077
34141
  this.Canvas.save();
34078
- for(var i in drawLines)
34142
+ this.ClipClient(this.IsHScreen);
34143
+ for(var i=0; i<drawLines.length; ++i)
34079
34144
  {
34080
34145
  if (this.LineDash) this.Canvas.setLineDash(this.LineDash);
34081
34146
  if (IFrameSplitOperator.IsPlusNumber(this.LineWidth)) this.Canvas.lineWidth=this.LineWidth*pixelRatio;
@@ -34091,7 +34156,7 @@ function ChartMultiLine()
34091
34156
  if (line.BGColor) //背景色
34092
34157
  {
34093
34158
  this.Canvas.fillStyle=line.BGColor;
34094
- for(var i in line.Point)
34159
+ for(var i=0; i<line.Point.length; ++i)
34095
34160
  {
34096
34161
  var item=line.Point[i];
34097
34162
  if (i==0)
@@ -34112,7 +34177,7 @@ function ChartMultiLine()
34112
34177
 
34113
34178
  this.Canvas.strokeStyle=line.Color;
34114
34179
  var drawCount=0;
34115
- for(var i in line.Point)
34180
+ for(var i=0; i<line.Point.length; ++i)
34116
34181
  {
34117
34182
  var item=line.Point[i];
34118
34183
  if (drawCount==0)
@@ -34862,7 +34927,7 @@ function ChartDrawSVG()
34862
34927
  var rightMargin=2;
34863
34928
  var itemSpace=2;
34864
34929
  var rtBorder={ Left:rtSVG.Right, Right:rtSVG.Right, Bottom:rtSVG.Bottom };
34865
-
34930
+ var rightBorder=0; //右边的边界 0=div的宽度 1=图形框架边框
34866
34931
  if (IFrameSplitOperator.IsNumber(data.ItemSpace)) itemSpace=data.ItemSpace;
34867
34932
  if (IFrameSplitOperator.IsNumber(data.YOffset)) rtBorder.Bottom+=data.YOffset;
34868
34933
  if (IFrameSplitOperator.IsNumber(data.XOffset)) rtBorder.Left+=data.XOffset;
@@ -34870,6 +34935,8 @@ function ChartDrawSVG()
34870
34935
  if (IFrameSplitOperator.IsNumber(data.LeftMargin)) lefMargin=data.LeftMargin;
34871
34936
  if (IFrameSplitOperator.IsNumber(data.RightMargin)) rightMargin=data.RightMargin;
34872
34937
 
34938
+ if (IFrameSplitOperator.IsNumber(data.RightBorder)) rightBorder=data.RightBorder;
34939
+
34873
34940
  if (data.Font) this.Canvas.font=data.Font;
34874
34941
  else this.Canvas.font=this.TextFont;
34875
34942
  this.Canvas.textBaseline='bottom';
@@ -34898,6 +34965,24 @@ function ChartDrawSVG()
34898
34965
  rtBorder.Width=rtBorder.Right-rtBorder.Left;
34899
34966
  rtBorder.Top=rtBorder.Bottom-rtBorder.Height;
34900
34967
 
34968
+ var right=this.ChartBorder.GetChartWidth()-1;
34969
+ if (rightBorder==1) right=this.ChartBorder.GetRight();
34970
+ if (rtBorder.Right>right) //右边显示不下,显示在左边
34971
+ {
34972
+ rtBorder.Right=rtSVG.Left;
34973
+ if (IFrameSplitOperator.IsNumber(data.XOffset)) rtBorder.Right-=data.XOffset;
34974
+ rtBorder.Left=rtBorder.Right-rtBorder.Width;
34975
+ var xText=rtBorder.Left+lefMargin;
34976
+ for(var i=0;i<aryText.length;++i)
34977
+ {
34978
+ if (i>0) xText+=itemSpace;
34979
+
34980
+ var item=aryText[i];
34981
+ item.X=xText;
34982
+ xText+=item.Width;
34983
+ }
34984
+ }
34985
+
34901
34986
  if (data.BGColor)
34902
34987
  {
34903
34988
  this.Canvas.fillStyle=data.BGColor;
@@ -17369,7 +17369,7 @@ function KLineFrame()
17369
17369
  }
17370
17370
  else
17371
17371
  {
17372
- var offset=this.ChartBorder.GetLeft()-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);
17372
+ var offset=(this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin)-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);
17373
17373
  var absIndex=Math.abs(index);
17374
17374
  for(var i=1;i<absIndex;++i)
17375
17375
  {
@@ -38111,6 +38111,7 @@ function ChartMultiLine()
38111
38111
  {
38112
38112
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
38113
38113
  if (!this.Data || this.Data.length<=0) return;
38114
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Lines)) return;
38114
38115
 
38115
38116
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
38116
38117
  var xPointCount=this.ChartFrame.XPointCount;
@@ -38118,44 +38119,108 @@ function ChartMultiLine()
38118
38119
 
38119
38120
  var drawLines=[];
38120
38121
  var arrowLines=[];
38121
- for(var i in this.Lines)
38122
+ for(var i=0; i<this.Lines.length; ++i)
38122
38123
  {
38123
38124
  var line=this.Lines[i];
38124
38125
  var drawPoints={ Point:[], Color:line.Color };
38125
38126
  var drawArrowPoints={ Start:[], End:[] };
38126
38127
  if (line.BGColor) drawPoints.BGColor=line.BGColor;
38127
- for(var j=0; j<line.Point.length; ++j)
38128
+ var isExtendLine=false;
38129
+ if (IFrameSplitOperator.IsBool(line.IsExtendLine)) isExtendLine=line.IsExtendLine;
38130
+ if (isExtendLine) //左右延申
38128
38131
  {
38129
- var point=line.Point[j];
38130
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
38131
-
38132
- var index=point.Index-offset;
38133
- if (index>=0 && index<xPointCount)
38132
+ var prePoint=null;
38133
+ var bFirstPoint=true;
38134
+ for(var j=0; j<line.Point.length; ++j)
38134
38135
  {
38135
- var x=this.ChartFrame.GetXFromIndex(index);
38136
- var y=this.ChartFrame.GetYFromData(point.Value, false);
38137
- var pointItem={X:x, Y:y, End:false};
38138
- drawPoints.Point.push(pointItem);
38136
+ var point=line.Point[j];
38137
+ if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
38138
+
38139
+ var index=point.Index-offset;
38140
+ if (index>0 && index<xPointCount)
38141
+ {
38142
+ if (bFirstPoint)
38143
+ {
38144
+ if (prePoint)
38145
+ {
38146
+ var preIndex=prePoint.Index-offset;
38147
+
38148
+ var x=this.ChartFrame.GetXFromIndex(preIndex, false);
38149
+ var y=this.ChartFrame.GetYFromData(prePoint.Value, false);
38150
+
38151
+ var pointItem={X:x, Y:y, End:false};
38152
+ drawPoints.Point.push(pointItem);
38153
+ }
38154
+
38155
+ bFirstPoint=false;
38156
+ }
38157
+
38158
+ var x=this.ChartFrame.GetXFromIndex(index, false);
38159
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
38160
+
38161
+ var pointItem={X:x, Y:y, End:false};
38162
+ drawPoints.Point.push(pointItem);
38163
+ }
38164
+ else
38165
+ {
38166
+ if (drawPoints.Point.length>0)
38167
+ {
38168
+ var x=this.ChartFrame.GetXFromIndex(index, false);
38169
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
38170
+
38171
+ var pointItem={X:x, Y:y, End:true};
38172
+ drawPoints.Point.push(pointItem);
38173
+
38174
+ bFirstPoint=true;
38175
+ prePoint=null;
38176
+ }
38177
+ }
38139
38178
 
38140
- if (j==0 || j==1) drawArrowPoints.Start.push(pointItem); //起始点
38141
- if (j==line.Point.length-1 || j==line.Point.length-2) drawArrowPoints.End.push(pointItem); //结束点
38179
+ prePoint=point;
38142
38180
  }
38143
- else
38181
+
38182
+ if (drawPoints.Point.length>=2)
38144
38183
  {
38145
- if (drawPoints.Point.length>0) drawPoints.Point[drawPoints.Point.length-1].End=true; //点断开
38184
+ drawLines.push(drawPoints);
38185
+ arrowLines.push(drawArrowPoints);
38146
38186
  }
38147
38187
  }
38148
-
38149
- if (drawPoints.Point.length>=2)
38188
+ else
38150
38189
  {
38151
- drawLines.push(drawPoints);
38152
- arrowLines.push(drawArrowPoints);
38190
+ for(var j=0; j<line.Point.length; ++j)
38191
+ {
38192
+ var point=line.Point[j];
38193
+ if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
38194
+
38195
+ var index=point.Index-offset;
38196
+ if (index>=0 && index<xPointCount)
38197
+ {
38198
+ var x=this.ChartFrame.GetXFromIndex(index);
38199
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
38200
+ var pointItem={X:x, Y:y, End:false};
38201
+ drawPoints.Point.push(pointItem);
38202
+
38203
+ if (j==0 || j==1) drawArrowPoints.Start.push(pointItem); //起始点
38204
+ if (j==line.Point.length-1 || j==line.Point.length-2) drawArrowPoints.End.push(pointItem); //结束点
38205
+ }
38206
+ else
38207
+ {
38208
+ if (drawPoints.Point.length>0) drawPoints.Point[drawPoints.Point.length-1].End=true; //点断开
38209
+ }
38210
+ }
38211
+
38212
+ if (drawPoints.Point.length>=2)
38213
+ {
38214
+ drawLines.push(drawPoints);
38215
+ arrowLines.push(drawArrowPoints);
38216
+ }
38153
38217
  }
38154
38218
  }
38155
38219
 
38156
38220
  var pixelRatio=GetDevicePixelRatio();
38157
38221
  this.Canvas.save();
38158
- for(var i in drawLines)
38222
+ this.ClipClient(this.IsHScreen);
38223
+ for(var i=0; i<drawLines.length; ++i)
38159
38224
  {
38160
38225
  if (this.LineDash) this.Canvas.setLineDash(this.LineDash);
38161
38226
  if (IFrameSplitOperator.IsPlusNumber(this.LineWidth)) this.Canvas.lineWidth=this.LineWidth*pixelRatio;
@@ -38171,7 +38236,7 @@ function ChartMultiLine()
38171
38236
  if (line.BGColor) //背景色
38172
38237
  {
38173
38238
  this.Canvas.fillStyle=line.BGColor;
38174
- for(var i in line.Point)
38239
+ for(var i=0; i<line.Point.length; ++i)
38175
38240
  {
38176
38241
  var item=line.Point[i];
38177
38242
  if (i==0)
@@ -38192,7 +38257,7 @@ function ChartMultiLine()
38192
38257
 
38193
38258
  this.Canvas.strokeStyle=line.Color;
38194
38259
  var drawCount=0;
38195
- for(var i in line.Point)
38260
+ for(var i=0; i<line.Point.length; ++i)
38196
38261
  {
38197
38262
  var item=line.Point[i];
38198
38263
  if (drawCount==0)
@@ -38942,7 +39007,7 @@ function ChartDrawSVG()
38942
39007
  var rightMargin=2;
38943
39008
  var itemSpace=2;
38944
39009
  var rtBorder={ Left:rtSVG.Right, Right:rtSVG.Right, Bottom:rtSVG.Bottom };
38945
-
39010
+ var rightBorder=0; //右边的边界 0=div的宽度 1=图形框架边框
38946
39011
  if (IFrameSplitOperator.IsNumber(data.ItemSpace)) itemSpace=data.ItemSpace;
38947
39012
  if (IFrameSplitOperator.IsNumber(data.YOffset)) rtBorder.Bottom+=data.YOffset;
38948
39013
  if (IFrameSplitOperator.IsNumber(data.XOffset)) rtBorder.Left+=data.XOffset;
@@ -38950,6 +39015,8 @@ function ChartDrawSVG()
38950
39015
  if (IFrameSplitOperator.IsNumber(data.LeftMargin)) lefMargin=data.LeftMargin;
38951
39016
  if (IFrameSplitOperator.IsNumber(data.RightMargin)) rightMargin=data.RightMargin;
38952
39017
 
39018
+ if (IFrameSplitOperator.IsNumber(data.RightBorder)) rightBorder=data.RightBorder;
39019
+
38953
39020
  if (data.Font) this.Canvas.font=data.Font;
38954
39021
  else this.Canvas.font=this.TextFont;
38955
39022
  this.Canvas.textBaseline='bottom';
@@ -38978,6 +39045,24 @@ function ChartDrawSVG()
38978
39045
  rtBorder.Width=rtBorder.Right-rtBorder.Left;
38979
39046
  rtBorder.Top=rtBorder.Bottom-rtBorder.Height;
38980
39047
 
39048
+ var right=this.ChartBorder.GetChartWidth()-1;
39049
+ if (rightBorder==1) right=this.ChartBorder.GetRight();
39050
+ if (rtBorder.Right>right) //右边显示不下,显示在左边
39051
+ {
39052
+ rtBorder.Right=rtSVG.Left;
39053
+ if (IFrameSplitOperator.IsNumber(data.XOffset)) rtBorder.Right-=data.XOffset;
39054
+ rtBorder.Left=rtBorder.Right-rtBorder.Width;
39055
+ var xText=rtBorder.Left+lefMargin;
39056
+ for(var i=0;i<aryText.length;++i)
39057
+ {
39058
+ if (i>0) xText+=itemSpace;
39059
+
39060
+ var item=aryText[i];
39061
+ item.X=xText;
39062
+ xText+=item.Width;
39063
+ }
39064
+ }
39065
+
38981
39066
  if (data.BGColor)
38982
39067
  {
38983
39068
  this.Canvas.fillStyle=data.BGColor;
@@ -127237,7 +127322,7 @@ function ScrollBarBGChart()
127237
127322
 
127238
127323
 
127239
127324
 
127240
- var HQCHART_VERSION="1.1.12374";
127325
+ var HQCHART_VERSION="1.1.12381";
127241
127326
 
127242
127327
  function PrintHQChartVersion()
127243
127328
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.12374";
8
+ var HQCHART_VERSION="1.1.12381";
9
9
 
10
10
  function PrintHQChartVersion()
11
11
  {
@@ -17413,7 +17413,7 @@ function KLineFrame()
17413
17413
  }
17414
17414
  else
17415
17415
  {
17416
- var offset=this.ChartBorder.GetLeft()-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);
17416
+ var offset=(this.ChartBorder.GetLeft()+g_JSChartResource.FrameLeftMargin)-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);
17417
17417
  var absIndex=Math.abs(index);
17418
17418
  for(var i=1;i<absIndex;++i)
17419
17419
  {
@@ -38155,6 +38155,7 @@ function ChartMultiLine()
38155
38155
  {
38156
38156
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
38157
38157
  if (!this.Data || this.Data.length<=0) return;
38158
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Lines)) return;
38158
38159
 
38159
38160
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
38160
38161
  var xPointCount=this.ChartFrame.XPointCount;
@@ -38162,44 +38163,108 @@ function ChartMultiLine()
38162
38163
 
38163
38164
  var drawLines=[];
38164
38165
  var arrowLines=[];
38165
- for(var i in this.Lines)
38166
+ for(var i=0; i<this.Lines.length; ++i)
38166
38167
  {
38167
38168
  var line=this.Lines[i];
38168
38169
  var drawPoints={ Point:[], Color:line.Color };
38169
38170
  var drawArrowPoints={ Start:[], End:[] };
38170
38171
  if (line.BGColor) drawPoints.BGColor=line.BGColor;
38171
- for(var j=0; j<line.Point.length; ++j)
38172
+ var isExtendLine=false;
38173
+ if (IFrameSplitOperator.IsBool(line.IsExtendLine)) isExtendLine=line.IsExtendLine;
38174
+ if (isExtendLine) //左右延申
38172
38175
  {
38173
- var point=line.Point[j];
38174
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
38175
-
38176
- var index=point.Index-offset;
38177
- if (index>=0 && index<xPointCount)
38176
+ var prePoint=null;
38177
+ var bFirstPoint=true;
38178
+ for(var j=0; j<line.Point.length; ++j)
38178
38179
  {
38179
- var x=this.ChartFrame.GetXFromIndex(index);
38180
- var y=this.ChartFrame.GetYFromData(point.Value, false);
38181
- var pointItem={X:x, Y:y, End:false};
38182
- drawPoints.Point.push(pointItem);
38180
+ var point=line.Point[j];
38181
+ if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
38182
+
38183
+ var index=point.Index-offset;
38184
+ if (index>0 && index<xPointCount)
38185
+ {
38186
+ if (bFirstPoint)
38187
+ {
38188
+ if (prePoint)
38189
+ {
38190
+ var preIndex=prePoint.Index-offset;
38191
+
38192
+ var x=this.ChartFrame.GetXFromIndex(preIndex, false);
38193
+ var y=this.ChartFrame.GetYFromData(prePoint.Value, false);
38194
+
38195
+ var pointItem={X:x, Y:y, End:false};
38196
+ drawPoints.Point.push(pointItem);
38197
+ }
38198
+
38199
+ bFirstPoint=false;
38200
+ }
38201
+
38202
+ var x=this.ChartFrame.GetXFromIndex(index, false);
38203
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
38204
+
38205
+ var pointItem={X:x, Y:y, End:false};
38206
+ drawPoints.Point.push(pointItem);
38207
+ }
38208
+ else
38209
+ {
38210
+ if (drawPoints.Point.length>0)
38211
+ {
38212
+ var x=this.ChartFrame.GetXFromIndex(index, false);
38213
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
38214
+
38215
+ var pointItem={X:x, Y:y, End:true};
38216
+ drawPoints.Point.push(pointItem);
38217
+
38218
+ bFirstPoint=true;
38219
+ prePoint=null;
38220
+ }
38221
+ }
38183
38222
 
38184
- if (j==0 || j==1) drawArrowPoints.Start.push(pointItem); //起始点
38185
- if (j==line.Point.length-1 || j==line.Point.length-2) drawArrowPoints.End.push(pointItem); //结束点
38223
+ prePoint=point;
38186
38224
  }
38187
- else
38225
+
38226
+ if (drawPoints.Point.length>=2)
38188
38227
  {
38189
- if (drawPoints.Point.length>0) drawPoints.Point[drawPoints.Point.length-1].End=true; //点断开
38228
+ drawLines.push(drawPoints);
38229
+ arrowLines.push(drawArrowPoints);
38190
38230
  }
38191
38231
  }
38192
-
38193
- if (drawPoints.Point.length>=2)
38232
+ else
38194
38233
  {
38195
- drawLines.push(drawPoints);
38196
- arrowLines.push(drawArrowPoints);
38234
+ for(var j=0; j<line.Point.length; ++j)
38235
+ {
38236
+ var point=line.Point[j];
38237
+ if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
38238
+
38239
+ var index=point.Index-offset;
38240
+ if (index>=0 && index<xPointCount)
38241
+ {
38242
+ var x=this.ChartFrame.GetXFromIndex(index);
38243
+ var y=this.ChartFrame.GetYFromData(point.Value, false);
38244
+ var pointItem={X:x, Y:y, End:false};
38245
+ drawPoints.Point.push(pointItem);
38246
+
38247
+ if (j==0 || j==1) drawArrowPoints.Start.push(pointItem); //起始点
38248
+ if (j==line.Point.length-1 || j==line.Point.length-2) drawArrowPoints.End.push(pointItem); //结束点
38249
+ }
38250
+ else
38251
+ {
38252
+ if (drawPoints.Point.length>0) drawPoints.Point[drawPoints.Point.length-1].End=true; //点断开
38253
+ }
38254
+ }
38255
+
38256
+ if (drawPoints.Point.length>=2)
38257
+ {
38258
+ drawLines.push(drawPoints);
38259
+ arrowLines.push(drawArrowPoints);
38260
+ }
38197
38261
  }
38198
38262
  }
38199
38263
 
38200
38264
  var pixelRatio=GetDevicePixelRatio();
38201
38265
  this.Canvas.save();
38202
- for(var i in drawLines)
38266
+ this.ClipClient(this.IsHScreen);
38267
+ for(var i=0; i<drawLines.length; ++i)
38203
38268
  {
38204
38269
  if (this.LineDash) this.Canvas.setLineDash(this.LineDash);
38205
38270
  if (IFrameSplitOperator.IsPlusNumber(this.LineWidth)) this.Canvas.lineWidth=this.LineWidth*pixelRatio;
@@ -38215,7 +38280,7 @@ function ChartMultiLine()
38215
38280
  if (line.BGColor) //背景色
38216
38281
  {
38217
38282
  this.Canvas.fillStyle=line.BGColor;
38218
- for(var i in line.Point)
38283
+ for(var i=0; i<line.Point.length; ++i)
38219
38284
  {
38220
38285
  var item=line.Point[i];
38221
38286
  if (i==0)
@@ -38236,7 +38301,7 @@ function ChartMultiLine()
38236
38301
 
38237
38302
  this.Canvas.strokeStyle=line.Color;
38238
38303
  var drawCount=0;
38239
- for(var i in line.Point)
38304
+ for(var i=0; i<line.Point.length; ++i)
38240
38305
  {
38241
38306
  var item=line.Point[i];
38242
38307
  if (drawCount==0)
@@ -38986,7 +39051,7 @@ function ChartDrawSVG()
38986
39051
  var rightMargin=2;
38987
39052
  var itemSpace=2;
38988
39053
  var rtBorder={ Left:rtSVG.Right, Right:rtSVG.Right, Bottom:rtSVG.Bottom };
38989
-
39054
+ var rightBorder=0; //右边的边界 0=div的宽度 1=图形框架边框
38990
39055
  if (IFrameSplitOperator.IsNumber(data.ItemSpace)) itemSpace=data.ItemSpace;
38991
39056
  if (IFrameSplitOperator.IsNumber(data.YOffset)) rtBorder.Bottom+=data.YOffset;
38992
39057
  if (IFrameSplitOperator.IsNumber(data.XOffset)) rtBorder.Left+=data.XOffset;
@@ -38994,6 +39059,8 @@ function ChartDrawSVG()
38994
39059
  if (IFrameSplitOperator.IsNumber(data.LeftMargin)) lefMargin=data.LeftMargin;
38995
39060
  if (IFrameSplitOperator.IsNumber(data.RightMargin)) rightMargin=data.RightMargin;
38996
39061
 
39062
+ if (IFrameSplitOperator.IsNumber(data.RightBorder)) rightBorder=data.RightBorder;
39063
+
38997
39064
  if (data.Font) this.Canvas.font=data.Font;
38998
39065
  else this.Canvas.font=this.TextFont;
38999
39066
  this.Canvas.textBaseline='bottom';
@@ -39022,6 +39089,24 @@ function ChartDrawSVG()
39022
39089
  rtBorder.Width=rtBorder.Right-rtBorder.Left;
39023
39090
  rtBorder.Top=rtBorder.Bottom-rtBorder.Height;
39024
39091
 
39092
+ var right=this.ChartBorder.GetChartWidth()-1;
39093
+ if (rightBorder==1) right=this.ChartBorder.GetRight();
39094
+ if (rtBorder.Right>right) //右边显示不下,显示在左边
39095
+ {
39096
+ rtBorder.Right=rtSVG.Left;
39097
+ if (IFrameSplitOperator.IsNumber(data.XOffset)) rtBorder.Right-=data.XOffset;
39098
+ rtBorder.Left=rtBorder.Right-rtBorder.Width;
39099
+ var xText=rtBorder.Left+lefMargin;
39100
+ for(var i=0;i<aryText.length;++i)
39101
+ {
39102
+ if (i>0) xText+=itemSpace;
39103
+
39104
+ var item=aryText[i];
39105
+ item.X=xText;
39106
+ xText+=item.Width;
39107
+ }
39108
+ }
39109
+
39025
39110
  if (data.BGColor)
39026
39111
  {
39027
39112
  this.Canvas.fillStyle=data.BGColor;
@@ -127281,7 +127366,7 @@ function ScrollBarBGChart()
127281
127366
 
127282
127367
 
127283
127368
 
127284
- var HQCHART_VERSION="1.1.12374";
127369
+ var HQCHART_VERSION="1.1.12381";
127285
127370
 
127286
127371
  function PrintHQChartVersion()
127287
127372
  {