private void PumpListView_ItemTapped(object sender, ItemTappedEventArgs e) { var SelectedPumpInfo = PumpListView.SelectedItem as PumpInfo; var TempList = SelectedPumpInfo.PSList as List <PressureSpeed>; var ListViewID = sender as ViewCell; RowPumpingSpeed.Clear(); RowDeliverySpeed.Clear(); RowConductance.Clear(); FinePumpingSpeed.Clear(); FinePDTimeNoL.Clear(); FinePDTimeLoss.Clear(); FinePDTimeOutG.Clear(); //page3 // //載入Puming curve for (int i = 0; i < TempList.Count; i++) { RowPumpingSpeed.Add(new PressureSpeed() { ValueX = TempList[i].ValueX, ValueY = TempList[i].ValueY }); RowDeliverySpeed.Add(new PressureSpeed() { ValueX = TempList[i].ValueX, ValueY = 0 }); RowConductance.Add(new PressureSpeed() { ValueX = TempList[i].ValueX, ValueY = 0 }); FinePumpingSpeed.Add(new PressureSpeed() { ValueX = TempList[i].ValueX, ValueY = TempList[i].ValueY }); } rowPumpCanvas = drawGrid.FormXlogYnature(rowPumpCanvas, RowPumpingSpeed); rowPumpCanvas = drawGrid.CurveXlogYnature(rowPumpCanvas, RowPumpingSpeed); //page4 // //計算各壓力流導 float alpha; float viscousBody; float molecularBody; for (int i = 0; i < RowConductance.Count; i++) { alpha = 4 * tubeDia / 3 / tubeLength; viscousBody = 0.0327f * (float)Math.Pow(tubeDia, 4) * RowConductance[i].ValueX / (tubeLength * 0.0001708f); molecularBody = 11.43f * alpha * (float)(Math.Sqrt(293.15 / 28.966f) * Math.Pow(tubeDia / 2f, 2)); RowConductance[i].ValueY = viscousBody + molecularBody; } rowTubeCanvas = drawGrid.FormXlogYlog(rowTubeCanvas, RowConductance); rowTubeCanvas = drawGrid.CurveXlogYlog(rowTubeCanvas, RowConductance); //refine page3 // //calculate delivery speed for (int i = 0; i < RowPumpingSpeed.Count; i++) { RowDeliverySpeed[i].ValueY = RowPumpingSpeed[i].ValueY * RowConductance[i].ValueY / (RowPumpingSpeed[i].ValueY + RowConductance[i].ValueY); } rowPumpCanvas = drawGrid.CurveXlogYnature(rowPumpCanvas, RowDeliverySpeed); //page 5 // //高於startPressure的座標只留最接近那個 while (FinePumpingSpeed[1].ValueX >= startPressure) { FinePumpingSpeed.RemoveAt(0); } //低於endPressure的座標只留最接近那個 while (FinePumpingSpeed[FinePumpingSpeed.Count - 2].ValueX <= endPressure) { FinePumpingSpeed.RemoveAt(FinePumpingSpeed.Count - 1); } //高於startPressure的座標Pressur=startPressure;Spee=線性內插 //低於endPressure的座標Pressur=endPressure;Spee=線性內插 int Idx = FinePumpingSpeed.Count - 1; FinePumpingSpeed[0].ValueY = MidPoint(FinePumpingSpeed[0].ValueX, FinePumpingSpeed[0].ValueY, FinePumpingSpeed[1].ValueX, FinePumpingSpeed[1].ValueY, startPressure); FinePumpingSpeed[0].ValueX = startPressure; FinePumpingSpeed[Idx].ValueY = MidPoint(FinePumpingSpeed[Idx - 1].ValueX, FinePumpingSpeed[Idx - 1].ValueY, FinePumpingSpeed[Idx].ValueX, FinePumpingSpeed[Idx].ValueY, endPressure); FinePumpingSpeed[Idx].ValueX = endPressure; for (int i = 0; i < FinePumpingSpeed.Count; i++) { FinePumpingSpeed[i].ValueX = (float)Math.Log10(FinePumpingSpeed[i].ValueX); } //計算內差的刻度 incrementPress = (FinePumpingSpeed[0].ValueX - FinePumpingSpeed[Idx].ValueX) / incrementNum; float speedMax = FinePumpingSpeed[0].ValueY; for (int i = 1; i < FinePumpingSpeed.Count; i++) { if (speedMax < FinePumpingSpeed[i].ValueY) { speedMax = FinePumpingSpeed[i].ValueY; } } incrementSpeed = speedMax / incrementNum; //距離太遠的兩點插入點 float insX, insY; Idx = 1; while (Idx < FinePumpingSpeed.Count) { //大於1代表兩點距離太寬; insX = (FinePumpingSpeed[Idx - 1].ValueX - FinePumpingSpeed[Idx].ValueX) / incrementPress; insY = Math.Abs(FinePumpingSpeed[Idx - 1].ValueY - FinePumpingSpeed[Idx].ValueY) / incrementSpeed; if (insX > 1f ^ insY > 1f) { //兩點之間是X比較寬還是Y比較寬 if (insX > insY) { insX = FinePumpingSpeed[Idx - 1].ValueX - incrementPress; insY = MidPoint(FinePumpingSpeed[Idx - 1].ValueX, FinePumpingSpeed[Idx - 1].ValueY, FinePumpingSpeed[Idx].ValueX, FinePumpingSpeed[Idx].ValueY, insX); FinePumpingSpeed.Insert(Idx, new PressureSpeed() { ValueX = insX, ValueY = insY }); } else { //insY已經是絕對值,要重新判斷正負 if (FinePumpingSpeed[Idx - 1].ValueY > FinePumpingSpeed[Idx].ValueY) { insY = FinePumpingSpeed[Idx - 1].ValueY - incrementSpeed; } else { insY = FinePumpingSpeed[Idx - 1].ValueY + incrementSpeed; } insX = MidPoint(FinePumpingSpeed[Idx - 1].ValueY, FinePumpingSpeed[Idx - 1].ValueX, FinePumpingSpeed[Idx].ValueY, FinePumpingSpeed[Idx].ValueX, insY); FinePumpingSpeed.Insert(Idx, new PressureSpeed() { ValueX = insX, ValueY = insY }); } } Idx++; } for (int i = 0; i < FinePumpingSpeed.Count; i++) { FinePumpingSpeed[i].ValueX = (float)Math.Pow(10, FinePumpingSpeed[i].ValueX); } //FinePDTimeNoL = FinePumpingSpeed; FinePDTimeNoL.Add(new PressureSpeed() { ValueX = 0, ValueY = FinePumpingSpeed[0].ValueX }); for (int i = 1; i < FinePumpingSpeed.Count; i++) { FinePDTimeNoL.Add(new PressureSpeed() { ValueX = FinePDTimeNoL[i - 1].ValueX + chamberVolume * 2 / (FinePumpingSpeed[i - 1].ValueY + FinePumpingSpeed[i].ValueY) * (float)Math.Log(FinePumpingSpeed[i - 1].ValueX / FinePumpingSpeed[i].ValueX), ValueY = FinePumpingSpeed[i].ValueX }); } finePumpCanvas = drawGrid.FormXnatureYlog(finePumpCanvas, FinePDTimeNoL); finePumpCanvas = drawGrid.CurveXnatureYlog(finePumpCanvas, FinePDTimeNoL); canvasViewPS.InvalidateSurface(); }