Ejemplo n.º 1
0
        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();
        }