//Form callingForm)
 public Form_BlockNameAndCorrdinate(Form callingForm,Class_BlockSect IX,Dictionary<string,int> DIX)
 {
     //修改Block
     II = IX;
     RDExamMainForm = callingForm as Form_RDExamProgress ;
     DI = DIX;
     InitializeComponent();
 }
        //public Class_Block_Interface(double 混凝土方塊與方塊摩擦係數值, double 混凝土方塊與拋石摩擦係數值, double 場注土方塊與拋石摩擦係數值, double 拋石與拋石摩擦係數值, double 混凝土陸上單位體積重量值, double 混凝土水中單位體積重量值, double 拋石陸上單位體積重量值, double 拋石水中單位體積重量值, double 砂土水中單位體積重量值, double 海水單位體積重量值,double 單位體積重量)
        //{
        //    //_混凝土方塊與方塊摩擦係數 = 混凝土方塊與方塊摩擦係數值;
        //    //_混凝土方塊與拋石摩擦係數 = 混凝土方塊與拋石摩擦係數值;
        //    //_場注土方塊與拋石摩擦係數 = 場注土方塊與拋石摩擦係數值;
        //    //_拋石與拋石摩擦係數 = 拋石與拋石摩擦係數值;
        //    //_混凝土陸上單位體積重量 = 混凝土陸上單位體積重量值;
        //    //_混凝土水中單位體積重量 = 混凝土水中單位體積重量值;
        //    //_拋石陸上單位體積重量 = 拋石陸上單位體積重量值;
        //    //_拋石水中單位體積重量 = 拋石水中單位體積重量值;
        //    //_砂土水中單位體積重量 = 砂土水中單位體積重量值;
        //    //_海水單位體積重量 = 海水單位體積重量值;
        //    _單位體積重量 = 單位體積重量;
        //}
        public Class_Block_Interface(Class_BlockSect M)
        {
            //_混凝土方塊與方塊摩擦係數 = M.混凝土方塊與方塊摩擦係數;
            //_混凝土方塊與拋石摩擦係數 = M.混凝土方塊與拋石摩擦係數;
            //_場注土方塊與拋石摩擦係數 = M.場注土方塊與拋石摩擦係數;
            //_拋石與拋石摩擦係數 = M.拋石與拋石摩擦係數;

            //_混凝土陸上單位體積重量 = M.混凝土陸上單位體積重量;
            //_混凝土水中單位體積重量 = M.混凝土水中單位體積重量;
            //_拋石陸上單位體積重量 = M.拋石陸上單位體積重量;
            //_拋石水中單位體積重量 = M.拋石水中單位體積重量;
            //_砂土水中單位體積重量 = M.砂土水中單位體積重量;
            //_海水單位體積重量 = M.海水單位體積重量;

            _單位體積重量 = M.單位體積重量;
            _使用材質 = M.使用材質;
            _計算Moment與否 = M.計算Moment與否;
        }
        private void 開啟舊的專案檔ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //只打開座標點位.
            if (OFD_專案.ShowDialog() == DialogResult.OK)
            {
                Class_BlockSect[] BlockMainArrayR = new Class_BlockSect[] { };
                int blockSizer = 0;
                XmlDocument doc = new XmlDocument();
                doc.Load(OFD_專案.FileName);
                bool 成功與否 = false;
                try
                {
                    XmlNodeList blockNodeCollection = doc.SelectNodes("Root/Blocks/形塊");
                    foreach (XmlNode BlockNode in blockNodeCollection)
                    {
                        Array.Resize(ref BlockMainArrayR, blockSizer + 1);
                        //RNode = BlockNode.SelectSingleNode("名稱");
                        //if (object.Equals(RNode, null))
                        //{
                        //    return "讀取Block的名稱失敗";
                        //}
                        int PointCount;
                        double[] getx = new double[] { };
                        double[] gety = new double[] { };
                        int getPointsize = 0;

                        Relement = (XmlElement)BlockNode;

                        BlockMainArrayR[blockSizer] = new Class_BlockSect();
                        BlockMainArrayR[blockSizer].名稱 = Relement.GetAttribute("名稱").ToString();
                        if (!int.TryParse(Relement.GetAttribute("點數").ToString(), out PointCount))
                        {
                            MessageBox.Show("Block讀取失敗!點數欄位無法讀取");
                            return;
                        }
                        BlockMainArrayR[blockSizer].座標點數 = PointCount;
                        double ftest;
                        bool btest;

                        //Block單位體積重量
                        RNode = BlockNode.SelectSingleNode("單位體積重量");
                        if (object.Equals(RNode, null))
                        {
                            MessageBox.Show("Block讀取單位體積重量失敗!");
                        }
                        Relement = (XmlElement)RNode;
                        if (!double.TryParse(Relement.GetAttribute("Value"), out ftest))
                        {
                            MessageBox.Show("Block讀取單位體積重量失敗!");
                        }
                        BlockMainArrayR[blockSizer].單位體積重量 = ftest;

                        //計算Moment與否.
                        RNode = BlockNode.SelectSingleNode("計算Moment");
                        if (object.Equals(RNode, null))
                        {
                            MessageBox.Show("Block讀取計算Moment狀況失敗!");
                        }
                        Relement = (XmlElement)RNode;
                        if (!bool.TryParse(Relement.GetAttribute("Value"), out btest))
                        {
                            MessageBox.Show("Block讀取計算Moment狀況失敗!");
                        }
                        BlockMainArrayR[blockSizer].計算Moment與否 = btest;

                        //Block使用材質
                        RNode = BlockNode.SelectSingleNode("使用材質");
                        if (object.Equals(RNode, null))
                        {
                            MessageBox.Show("Block讀取Block使用材質失敗!!");
                        }
                        Relement = (XmlElement)RNode;
                        /*
                        if (Relement.GetAttribute("Value").ToString() != "")
                        {
                            if (!DDR.ContainsKey(Relement.GetAttribute("Value").ToString()))
                            {
                                MessageBox.Show("Block讀取Block使用材質失敗!!";
                            }
                            else
                            {
                                //Nothing.
                            }
                        }*/
                        BlockMainArrayR[blockSizer].使用材質 = Relement.GetAttribute("Value");

                        string[] GetRE = new string[] { };
                        XmlNodeList Block周圍參考材質 = BlockNode.SelectNodes("周圍參考材質");
                        if (!object.Equals(Block周圍參考材質, null))
                        {
                            foreach (XmlNode MD in Block周圍參考材質)
                            {
                                Relement = (XmlElement)MD;
                                /*
                                if (!DDR.ContainsKey(Relement.GetAttribute("Value").ToString()))
                                {
                                    return "Block讀取周圍參考材質";
                                }
                                */
                                Array.Resize(ref GetRE, GetRE.GetLength(0) + 1);
                                GetRE[GetRE.GetUpperBound(0)] = Relement.GetAttribute("Value");
                            }
                        }
                        BlockMainArrayR[blockSizer].周圍參考材質 = GetRE;

                        XmlNodeList CoordinateCollection = BlockNode.SelectNodes("BlockCoordinate");
                        if (object.Equals(CoordinateCollection, null))
                        {
                            MessageBox.Show("Block讀取座標失敗");
                        }

                        foreach (XmlNode CN in CoordinateCollection)
                        {
                            Relement = (XmlElement)CN;
                            Array.Resize(ref getx, getPointsize + 1);
                            Array.Resize(ref gety, getPointsize + 1);

                            if (!double.TryParse(Relement.GetAttribute("xValue"), out ftest))
                            {
                                MessageBox.Show("Block讀取座標時無法順利從'xValue'欄位轉換座標值");
                            }
                            getx[getPointsize] = ftest;
                            if (!double.TryParse(Relement.GetAttribute("yValue"), out ftest))
                            {
                                MessageBox.Show("Block讀取座標時無法順利從'yValue'欄位轉換座標值");
                            }
                            gety[getPointsize] = ftest;
                            getPointsize += 1;
                        }

                        if (!(getPointsize == PointCount))
                        {
                            MessageBox.Show("Block讀取座標點數量不一致!");
                        }

                        BlockMainArrayR[blockSizer].X = getx;
                        BlockMainArrayR[blockSizer].Y = gety;

                        blockSizer += 1;
                    }

                    RNode = doc.SelectSingleNode("Root/Blocks/選取Block序號");
                    if (object.Equals(RNode, null))
                    {
                        MessageBox.Show("讀取Block選取序號時失敗");
                    }
                    int itest;
                    Relement = (XmlElement)RNode;
                    if (!int.TryParse(Relement.GetAttribute("Value"), out itest))
                    {
                        MessageBox.Show("轉換Block選取序號時失敗");
                    }
                    int selectedBlockIndex = itest;
                    if (selectedBlockIndex > BlockMainArrayR.GetUpperBound(0))
                    {
                        MessageBox.Show("Block選取序號超過檔案內紀錄的Block數量!");
                    }

                    //檢核區塊.
                    成功與否 = true;
                }
                catch
                {
                    //MessageBox.Show("出現錯誤!");
                }

                Form_BlockNameAndCorrdinate p = new Form_BlockNameAndCorrdinate();
                for (int i = 0; i < BlockMainArrayR.GetLength(0); i++)
                {
                    if (!p.CheckIsConvexPolygonAndCounterClockWise(BlockMainArrayR[i].X, BlockMainArrayR[i].Y))
                    {
                        //若排列順序非逆時針.
                        MessageBox.Show("Block" + (i + 1).ToString() + "(從1開始)的座標矩陣錯誤,此Block非凸邊形且座標沒有依照逆時針方向紀錄!!");
                    }
                }
                BlockMainArray = BlockMainArrayR;
                //加入行塊資訊.
                for (int i = 0; i < BlockMainArray.GetLength(0); i++)
                {
                    BlockMainArray[i] = BlockMainArrayR[i];
                }
                toolStripStatusLabel1.Text = "開啟完成,取得" + BlockMainArray.GetLength(0).ToString() + "個區塊";

                //*****
                //填入資訊.
                data_BlockTempShow.Rows.Clear();
                DataGridViewRowCollection rows = data_BlockTempShow.Rows;
                for(int i=0;i<BlockMainArray.GetLength(0);i++)
                {
                    //序號, 形塊名稱, 單位體積重量, 周圍參考材質, 使用材質.
                    string temp = "";
                    for(int i2=0;i2<BlockMainArray[i].周圍參考材質.GetLength(0);i2++)
                    {
                        temp += (BlockMainArray[i].周圍參考材質[i2]);
                        if(i2!=(BlockMainArray[i].周圍參考材質.GetUpperBound(0)))
                        {
                            temp += ",";
                        }
                    }
                    rows.Add(new object[] { (i + 1).ToString(), BlockMainArray[i].名稱, BlockMainArray[i].單位體積重量, temp, BlockMainArray[i].使用材質 });
                }

                if(成功與否)
                {
                    MessageBox.Show("成功載入");
                }
                else
                {
                    MessageBox.Show("載入失敗");
                }
               //******************
            }
        }
        private void btn_OK_Click(object sender, EventArgs e)
        {
            //將變數傳回.
            int 點數 = dataGridView1.Rows.Count;
            double[] xout = new double[] { };
            double[] yout = new double[] { };
            double xtest;
            double ytest;
            //Array.Resize(ref xout, 點數);
            //Array.Resize(ref yout, 點數);
            //string ss = "";
            for (int i=0;i<點數;i++)
            {
                double.TryParse(dataGridView1.Rows[i].Cells[0].Value.ToString(), out xtest);
                double.TryParse(dataGridView1.Rows[i].Cells[1].Value.ToString(), out ytest);
                if(i==點數-1 && xtest==xout[0] && ytest==yout[0])
                {
                    break;
                }
                Array.Resize(ref xout, i + 1);
                Array.Resize(ref yout, i + 1);
                xout[i] = xtest;
                yout[i] = ytest;
                //ss = ss + ("X = " + xout[i].ToString() + " , " + yout[i].ToString());
            }

            //檢查是否為凸邊形,且點位順序為逆時針.
            //不符合時,跳出警訊.
            if(!CheckIsConvexPolygonAndCounterClockWise(xout,yout))
            {
                //失敗.
                MessageBox.Show("注意,您所輸入的Polygon形狀限定為凸邊形且點位順序應為逆時針!!","Polygon設定失敗",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return;
            }

            //MessageBox.Show(ss);
            II = new Class_BlockSect();
            II.名稱 = nowname;// textBox_NameInput.Text;
            II.X = xout;
            II.Y = yout;
            II.座標點數 = xout.GetUpperBound(0) + 1;
            RDExamMainForm.BlockObj = II;
            this.Close();
        }