CreatePIE提供了一個參數,也就是餅圖制作的容器,我們通過Draw的上述代碼已經建立了一個V:Group元素,這個也就是餅圖繪制的容器了。
var mX=Math.pow(2,16) * 360;
//這個參數是劃圖形的關鍵
//AE x y width height startangle endangle
//x y表示圓心位置
//width height形狀的大小
//startangle endangle的計算方法如下
// 2^16 * 度數
var vTotal=0;
var startAngle=0;
var endAngle=0;
var pIEAngle=0;
var prePIEAngle=0;
//計算數據的總和
for(i=0;i<this.all.length;i++){
vTotal+=this.all[i].Value;
}
//建立圖例容器
//這裡子元素的left,top或者width都是針對於容器設置的坐標系統而言的
//例如
//圖表容器我設置了coordsize為 21600,21600,那麼objLengendGroup的位置都是相對於這個坐標系統而言的
//和實際圖形顯示的大小沒有直接關系
var objLegendGroup=document.createElement("v:group");
with(objLegendGroup){
style.left="17000px";
style.top="4000px";
style.width="4000px";
style.height=1400 * this.all.length +"px";
coordsize="21600,21600";
}
//做圖例的背景填充並且設置陰影
var objLegendRect=document.createElement("v:rect");
objLegendRect.fillcolor=" #EBF<?XML:namespace prefix = st1 ns = "urn:schemas-microsoft-com:Office:smarttags" />
這個時候,我們已經完成了各個區域位置的繪制,通過如上的代碼,我繪制了一個LegendGroup,將其作為圖例的顯示位置,另外主的V:group就作為pie的繪制容器,如果出於規范的考慮,也應該將PIE的各個shape放到一個group中,那樣在日後的編程控制中會更加方便一點。
下面的這段代碼也就是我要講述的,因為代碼比較關鍵,除了給出代碼,我還著重的說明各個語句的作用。
for(i=0;i<this.all.length;i++){ //順序的劃出各個餅圖
var vPIEEl=document.createElement("v:shape");
var vPIEId=document.uniqueID;
vPIEEl.style.width="15000px";
vPIEEl.style.height="14000px";
vPIEEl.style.top="4000px";
vPIEEl.style.left="1000px";
vPIEEl.adj="0,0";
vPIEEl.coordsize="1500,1400";
vPIEEl.strokecolor="white";
vPieEl.id=vPIEId;
vPIEEl.style.zIndex=1;
vPIEEl.onmouSEOver="HoverPIE(this)";
vPIEEl.onmouSEOut="RestorePIE(this)";
pIEAngle= this.all[i].Value / vTotal;
startAngle+=prePIEAngle;
prePieAngle=pIEAngle;
endAngle=pIEAngle;
vPIEEl.path="M 750 700 AE 750 700 750 700 " + parseInt(mX * startAngle) +" " + parseInt(mX * endAngle) +" xe";
vPIEEl.title=this.all[i].Name +"n所占比例:"+ endAngle * 100 +"%n詳細描述:" +this.all[i].TooltipText;
vPIEEl._scale=parseInt( 360 * (startAngle + endAngle /2));
var objFill=document.createElement("v:fill");
objFill.rotate="t";
objFill.focus="100%";
objFill.type="gradIEnt";
objFill.angle=parseInt( 360 * (startAngle + endAngle /2));
var objTextbox=document.createElement("v:textbox");
objTextbox.innerHtml=this.all[i].Name +":" + this.all[i].Value;
objTextbox.inset="5px 5px 5px 5px";
objTextbox.style.width="100px";
objTextbox.style.height="20px";
var vColor=this.RandColor();
vPIEEl.fillcolor=vColor; //設置顏色
//開始畫圖例
p.innerText=vPIEEl.outerHtml;
var colorTip=document.createElement("v:rect");
var iHeight=parseInt(21600 / (this.all.length * 2));
var iWidth=parseInt(iHeight * parseInt(objLegendGroup.style.height) /parseInt(objLegendGroup.style.width) /1.5 );
colorTip.style.height= iHeight;
colorTip.style.width=iWidth;
colorTip.style.top=iHeight * i * 2 + parseInt(iHeight /2);
colorTip.style.left=parseInt(iWidth /2);
colorTip.fillcolor=vColor;
colorTip.element=vPIEId;
//colorTip.attachEvent("onmouse",LegendMouSEOverEvent);
colorTip.onmouseover="LegendMouSEOverEvent()";
colorTip.onmouseout="LegendMouSEOutEvent()";
var textTip=document.createElement("v:rect");
textTip.style.top=parseInt(colorTip.style.top)- 500;
textTip.style.left= iWidth * 2;
textTip.innerHtml="<v:textbox style="font-size:12px;font-weight:bold">" + this.all[i].Name +"("+ this.all[i].Value+")
v:textbox>";
objLegendGroup.appendChild(colorTip);
objLegendGroup.appendChild(textTip);
vGroup.appendChild(vPIEEl);
}