Esempio n. 1
0
        private void btOK_Click(object sender, EventArgs e)
        {
            try
            {
                string          strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + this.textBoxFile.Text + ";Extended Properties=Excel 8.0";
                OleDbConnection conn   = new OleDbConnection(strCon);
                string          sql1   = "select * from [Sheet1$]";
                conn.Open();
                OleDbDataAdapter myCommand = new OleDbDataAdapter(sql1, strCon);
                DataSet          ds        = new DataSet();
                myCommand.Fill(ds);
                conn.Close();
                DataTable alignmentPointTable = ds.Tables[0];
                if (!alignmentPointTable.Columns.Contains("对齐里程"))
                {
                    MessageBox.Show("对齐外检测表的'对齐里程' 不存在!");
                    return;
                }
                alignmentPointTable.Columns["对齐里程"].DataType = System.Type.GetType("System.Double");


                strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + this.textBoxFileBase.Text + ";Extended Properties=Excel 8.0";
                conn   = new OleDbConnection(strCon);
                sql1   = "select * from [Sheet1$]";
                conn.Open();
                myCommand = new OleDbDataAdapter(sql1, strCon);
                ds        = new DataSet();
                myCommand.Fill(ds);
                conn.Close();
                DataTable basetable = ds.Tables[0];

                double tolerance   = Convert.ToDouble(numericUpDown1.Value);
                string measurevcol = "对齐里程";
                MatchWaijianceTable(basetable, ref alignmentPointTable, measurevcol, tolerance);

                FrmIMUAlignmentresult frm = new FrmIMUAlignmentresult(alignmentPointTable);
                frm.setResultType("两次外检测对齐报告");
                frm.BasePointTable      = basetable;
                frm.AlignmentPointTable = alignmentPointTable;
                frm.ShowDialog();
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Esempio n. 2
0
        private void buttonXOK_Click(object sender, EventArgs e)
        {
            try
            {
                if (IMUFeatureList.Count < 2)
                {
                    MessageBox.Show("最少需要2个特征点");
                    return;
                }

                IQueryFilter  pQF     = null;
                IFeatureClass pLineFC = CenterlinePointLayer.FeatureClass;
                DataTable     CenterlinePointTable = AOFunctions.GDB.ITableUtil.GetDataTableFromITable(pLineFC as ITable, pQF);
                IFeatureClass pPointFC             = IMULayer.FeatureClass;

                DataTable IMUTable;
                IMUTable = AOFunctions.GDB.ITableUtil.GetDataTableFromITable(pPointFC as ITable, pQF);

                Dictionary <DataRow, DataRow> MatchedDataRowPair = new Dictionary <DataRow, DataRow>();
                List <IFeature> sortedIMUList = (from IFeature f in IMUFeatureList
                                                 select f).OrderBy(x => x.get_Value(x.Fields.FindField(EvConfig.IMUMoveDistanceField))).ToList();

                List <IFeature> sortedCenterlinePointList = (from IFeature f in CenterlinePointFeatureList
                                                             select f).OrderBy(x => x.get_Value(x.Fields.FindField(EvConfig.CenterlineMeasureField))).ToList();


                DataView dv = CenterlinePointTable.DefaultView;
                // dv.Sort = "里程(m) ASC";
                dv.Sort = EvConfig.CenterlineMeasureField + " ASC";
                CenterlinePointTable = dv.ToTable();
                dv = IMUTable.DefaultView;
                // dv.Sort = "记录距离__ ASC";
                dv.Sort  = EvConfig.IMUMoveDistanceField + " ASC";
                IMUTable = dv.ToTable();


                // double centerlineLength = endM - beginM;
                if (!IMUTable.Columns.Contains("X"))
                {
                    IMUTable.Columns.Add("X", System.Type.GetType("System.Double"));
                }
                if (!IMUTable.Columns.Contains("Y"))
                {
                    IMUTable.Columns.Add("Y", System.Type.GetType("System.Double"));
                }
                if (!IMUTable.Columns.Contains("Z"))
                {
                    IMUTable.Columns.Add("Z", System.Type.GetType("System.Double"));
                }
                if (!IMUTable.Columns.Contains("里程差"))
                {
                    IMUTable.Columns.Add("里程差", System.Type.GetType("System.Double"));
                }
                if (!IMUTable.Columns.Contains("对齐里程"))
                {
                    IMUTable.Columns.Add("对齐里程", System.Type.GetType("System.Double"));
                }

                for (int i = 0; i < IMUFeatureList.Count; i++)
                {
                    int     oid1          = sortedIMUList[i].OID;
                    int     oid2          = sortedCenterlinePointList[i].OID;
                    DataRow IMURow        = IMUTable.AsEnumerable().First(x => Convert.ToInt16(x[0]) == oid1);
                    DataRow CenterlineRow = CenterlinePointTable.AsEnumerable().First(x => Convert.ToInt16(x[0]) == oid2);
                    MatchedDataRowPair.Add(IMURow, CenterlineRow);
                }


                foreach (DataRow r in IMUTable.Rows)
                {
                    r["对齐里程"] = DBNull.Value;
                    r["里程差"]  = DBNull.Value;
                }

                double endIMUM   = Convert.ToDouble(IMUTable.Rows[IMUTable.Rows.Count - 1][EvConfig.IMUMoveDistanceField]);
                double beginIMUM = Convert.ToDouble(IMUTable.Rows[0][EvConfig.IMUMoveDistanceField]);
                double IMULength = endIMUM - beginIMUM;

                double CenterlineBeginM = Convert.ToDouble(CenterlinePointTable.Rows[0][EvConfig.CenterlineMeasureField]);
                double CenterlineEndM   = Convert.ToDouble(CenterlinePointTable.AsEnumerable().Last()[EvConfig.CenterlineMeasureField]);

                foreach (DataRow r in MatchedDataRowPair.Keys)
                {
                    r["对齐里程"] = MatchedDataRowPair[r][EvConfig.CenterlineMeasureField];
                    r["里程差"]  = 0;
                }

                //List<DataRow> WantouPointList = (from DataRow r in IMUTable.Rows
                //                                 where r["类型"].ToString().Contains("弯头")
                //                                 select r).ToList();
                //List<DataRow> GuandianPointList = (from DataRow r in CenterlinePointTable.Rows
                //                                   where r["测点属性"].ToString().Contains("拐点")
                //                                   select r).ToList();

                DataTable alignmentPointTable = IMUTable;

                double beginM = 0;
                double endM   = 0;
                var    query  = (from r in alignmentPointTable.AsEnumerable()
                                 where r["对齐里程"] != DBNull.Value
                                 select r).ToList();
                if (query.Count > 0)
                {
                    DataRow r = query[0];
                    if (IMUTable.Rows[0]["对齐里程"] != DBNull.Value)
                    {
                        beginM = Convert.ToDouble(IMUTable.Rows[0]["对齐里程"]);
                    }
                    else
                    {
                        beginM = Convert.ToDouble(r["对齐里程"]) -
                                 (Convert.ToDouble(r[EvConfig.IMUMoveDistanceField]) - Convert.ToDouble(alignmentPointTable.Rows[0][EvConfig.IMUMoveDistanceField]));
                        alignmentPointTable.Rows[0]["对齐里程"] = beginM;
                    }


                    int idx = alignmentPointTable.Rows.Count - 1;
                    r = query[query.Count - 1];

                    if (IMUTable.AsEnumerable().Last()["对齐里程"] != DBNull.Value)
                    {
                        endM = Convert.ToDouble(IMUTable.AsEnumerable().Last()["对齐里程"]);
                    }
                    else
                    {
                        endM = Convert.ToDouble(r["对齐里程"]) +
                               (Convert.ToDouble(alignmentPointTable.Rows[idx][EvConfig.IMUMoveDistanceField]) - Convert.ToDouble(r[EvConfig.IMUMoveDistanceField]));
                        alignmentPointTable.Rows[idx]["对齐里程"] = endM;
                    }
                }

                if (beginM < CenterlineBeginM)
                {
                    beginM = CenterlineBeginM;
                    alignmentPointTable.Rows[0]["对齐里程"] = beginM;
                }
                if (endM > CenterlineEndM)
                {
                    int idx = alignmentPointTable.Rows.Count - 1;
                    endM = CenterlineEndM;
                    alignmentPointTable.Rows[idx]["对齐里程"] = endM;
                }


                DataRow PrevRowWithM = null;
                for (int i = 0; i < IMUTable.Rows.Count; i++)
                {
                    DataRow r = IMUTable.Rows[i];
                    if (r["对齐里程"] != DBNull.Value)
                    {
                        PrevRowWithM = r;
                    }
                    else
                    {
                        DataRow NextRowWithM = null;
                        for (int j = i + 1; j < IMUTable.Rows.Count; j++)
                        {
                            DataRow r2 = IMUTable.Rows[j];
                            if (r2["对齐里程"] != DBNull.Value)
                            {
                                NextRowWithM = r2;
                                break;
                            }
                        }
                        if (PrevRowWithM == null || NextRowWithM == null)
                        {
                            break;
                        }
                        double BeginJiluM   = Convert.ToDouble(PrevRowWithM[EvConfig.IMUMoveDistanceField]);
                        double endJiluM     = Convert.ToDouble(NextRowWithM[EvConfig.IMUMoveDistanceField]);
                        double BeginAM      = Convert.ToDouble(PrevRowWithM["对齐里程"]);
                        double endAM        = Convert.ToDouble(NextRowWithM["对齐里程"]);
                        double currentJiluM = Convert.ToDouble(r[EvConfig.IMUMoveDistanceField]);
                        r["对齐里程"] = (currentJiluM - BeginJiluM) * (endAM - BeginAM) / (endJiluM - BeginJiluM) + BeginAM;
                    }
                }

                IFeatureLayer pLinearlayer = CenterlineLinarLayer;

                IFeatureCursor pcursor  = pLinearlayer.FeatureClass.Search(null, false);
                IFeature       pFeature = pcursor.NextFeature();
                IPolyline      pline    = pFeature.Shape as IPolyline;
                IMSegmentation mSegment = pline as IMSegmentation;
                double         maxM     = mSegment.MMax;
                double         minM     = mSegment.MMin;

                //if (beginM > maxM || beginM < minM || endM > maxM || endM < minM)
                //{
                //    MessageBox.Show("输入的起始或终点里程值超出中线里程范围!");
                //    return;
                //}

                for (int i = 0; i < IMUTable.Rows.Count; i++)
                {
                    DataRow r = IMUTable.Rows[i];
                    double  M = Convert.ToDouble(r["对齐里程"]);

                    IGeometryCollection ptcollection = mSegment.GetPointsAtM(M, 0);
                    IPoint pt = ptcollection.get_Geometry(0) as IPoint;
                    r["X"] = pt.X;
                    r["Y"] = pt.Y;
                    r["Z"] = pt.Z;
                }


                FrmIMUAlignmentresult frm = new FrmIMUAlignmentresult(IMUTable);
                frm.CenterlinePointTable = CenterlinePointTable;
                frm.setResultType("内检测对齐中线报告");
                frm.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Esempio n. 3
0
        private void btOK_Click(object sender, EventArgs e)
        {
            try
            {
                string        pPointFileName   = cboBoxPointLayer.SelectedItem.ToString();
                string        pCenterlinName   = comboBoxExCenterlineLinearLayer.SelectedItem.ToString();
                IFeatureLayer pPointLayer      = null;
                IFeatureLayer pCenterlineLayer = null;
                for (int i = 0; i < pMapcontrol.LayerCount; i++)
                {
                    if (pPointFileName == pMapcontrol.get_Layer(i).Name)
                    {
                        pPointLayer = pMapcontrol.get_Layer(i) as IFeatureLayer;
                    }
                    if (pCenterlinName == pMapcontrol.get_Layer(i).Name)
                    {
                        pCenterlineLayer = pMapcontrol.get_Layer(i) as IFeatureLayer;
                    }
                }
                IFeatureClass  pLineFC      = pCenterlineLayer.FeatureClass;
                IFeatureClass  pPointFC     = pPointLayer.FeatureClass;
                IFeatureCursor pLineCursor  = pLineFC.Search(null, false);
                IFeature       pLineFeature = pLineCursor.NextFeature();
                IQueryFilter   qf1          = null;
                DataTable      ptable;

                if (radioButtonLayer.Checked)
                {
                    ptable = AOFunctions.GDB.ITableUtil.GetDataTableFromITable(pPointFC as ITable, qf1);
                }
                else
                {
                    string          strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + this.textBoxFile.Text + ";Extended Properties=Excel 8.0";
                    OleDbConnection conn   = new OleDbConnection(strCon);
                    string          sql1   = "select * from [Sheet1$]";
                    conn.Open();
                    OleDbDataAdapter myCommand = new OleDbDataAdapter(sql1, strCon);
                    DataSet          ds        = new DataSet();
                    myCommand.Fill(ds);
                    conn.Close();
                    ptable = ds.Tables[0];
                    if (ptable.Columns.Contains(EvConfig.IMUMoveDistanceField))
                    {
                        ptable.Columns[EvConfig.IMUMoveDistanceField].DataType = System.Type.GetType("System.Double");
                    }
                }


                if (!ptable.Columns.Contains("X"))
                {
                    ptable.Columns.Add("X", System.Type.GetType("System.Double"));
                }
                if (!ptable.Columns.Contains("Y"))
                {
                    ptable.Columns.Add("Y", System.Type.GetType("System.Double"));
                }
                if (!ptable.Columns.Contains("Z"))
                {
                    ptable.Columns.Add("Z", System.Type.GetType("System.Double"));
                }
                if (!ptable.Columns.Contains("对齐里程"))
                {
                    ptable.Columns.Add("对齐里程", System.Type.GetType("System.Double"));
                }
                if (!ptable.Columns.Contains("距离偏移"))
                {
                    ptable.Columns.Add("距离偏移", System.Type.GetType("System.Double"));
                }
                ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
                //wgs 84
                IGeographicCoordinateSystem wgs84 = spatialReferenceFactory.CreateGeographicCoordinateSystem(4326) as IGeographicCoordinateSystem;
                IUnit meterUnit = spatialReferenceFactory.CreateUnit((int)ESRI.ArcGIS.Geometry.esriSRUnitType.esriSRUnit_Meter);

                IPolyline pline = pLineFeature.Shape as IPolyline;
                pline.SpatialReference = wgs84;

                IProximityOperator pPO = pline as IProximityOperator;

                int idx = 0;
                for (int i = 0; i < ptable.Rows.Count; i++)
                {
                    try
                    {
                        DataRow r  = ptable.Rows[i];
                        IPoint  pt = new PointClass();
                        pt.X = Convert.ToDouble(r[EvConfig.WeldXField]);
                        pt.Y = Convert.ToDouble(r[EvConfig.WeldYField]);
                        pt.SpatialReference = wgs84;
                        IPoint ptInLine = pPO.ReturnNearestPoint(pt, esriSegmentExtension.esriNoExtension);
                        r["X"]    = ptInLine.X;
                        r["Y"]    = ptInLine.Y;
                        r["对齐里程"] = ptInLine.M;
                        r["Z"]    = ptInLine.Z;

                        r["距离偏移"] = Math.Round(DataAlignment.DataAlignment.CalculateDistanceBetween84TwoPoints(pt, ptInLine), 2);
                    }
                    catch
                    {
                    }
                }
                System.Runtime.InteropServices.Marshal.ReleaseComObject(spatialReferenceFactory);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pLineCursor);


                FrmIMUAlignmentresult frm = new FrmIMUAlignmentresult(ptable);
                frm.setResultType("焊缝对齐报告");
                frm.ShowDialog();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }