using SuperMap.Data; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using WWPipeLine.MapBasic; namespace WWPipeLine.MapTools.Conditions.AnalystToolBar { public partial class PengZhuangAnalystResult : Sunny.UI.UIForm { private DataTable m_dt; private double m_banjing; private string m_fenxileixing; private int m_selectSMID; private double[] m_jingju; public PengZhuangAnalystResult(DataTable dt, double banjing, string fenxileixing, int selectID, double[] _jingju) { InitializeComponent(); this.StartPosition = FormStartPosition.Manual; this.Location = new System.Drawing.Point(10, 10); m_dt = dt; m_banjing = banjing; m_selectSMID = selectID; m_fenxileixing = GetFenxi(fenxileixing); m_jingju = _jingju; string GetFenxi(string vaaaa) { switch (vaaaa) { case "碰撞": return "碰撞分析(包括水平和垂直净距)"; case "水平": return "水平净距分析(水平净距只分析与目标管线不想交的管线)"; case "垂直": return "垂直净距分析(垂直净距只分析与目标管线相交的管线)"; default: return ""; } } //this.Text = string.Format("{0} 半径为{1}米 分析管线{2}根 选择管线SMID={3} ", m_fenxileixing, banjing, dt.Rows.Count, selectID); this.Text = m_fenxileixing; } private void PengZhuangAnalystResult_Load(object sender, EventArgs e) { DataTable dtFinal = new DataTable { TableName = "PengZhuangAnalystResultDataTable" }; dtFinal.Columns.Add(new DataColumn { ColumnName = "gxsmid", Caption = "选中管线编号" }); dtFinal.Columns.Add(new DataColumn { ColumnName = "gxsmidfx", Caption = "分析管线编号" }); dtFinal.Columns.Add(new DataColumn { ColumnName = "spjj", Caption = "水平净距" }); dtFinal.Columns.Add(new DataColumn { ColumnName = "bzspjj", Caption = "标准水平净距" }); dtFinal.Columns.Add(new DataColumn { ColumnName = "czjj", Caption = "垂直净距" }); dtFinal.Columns.Add(new DataColumn { ColumnName = "bzczjj", Caption = "标准垂直净距" }); //选择的管线,只能有一条 DataRow[] drSelect = m_dt.Select(string.Format(" smid='{0}' and qdgc<>'' and zdgc<>'' and qdsmid<>'' and zdsmid<>'' ", m_selectSMID.ToString())); if (drSelect.Length != 1) { Sunny.UI.UIMessageTip.ShowError("当前选择管线缺少配置,无法完成分析!"); this.Close(); return; } Point2D selectQidian = new Point2D(double.Parse(drSelect[0]["qdsmx"].ToString()), double.Parse(drSelect[0]["qdsmy"].ToString())); Point2D selectZhongDian = new Point2D(double.Parse(drSelect[0]["zdsmx"].ToString()), double.Parse(drSelect[0]["zdsmy"].ToString())); GeoLine selectGuanxian = new GeoLine(new Point2Ds(selectQidian, selectZhongDian)); double selectGXgj = double.Parse(drSelect[0]["gj"].ToString()) * 0.001; double selectGXqdgc = double.Parse(drSelect[0]["qdgc"].ToString()); double selectGXzdgc = double.Parse(drSelect[0]["zdgc"].ToString()); //这里不仅去掉选择管线,去掉管线的两头管线,同时去掉 没有起始点号和终点点号的管线 DataRow[] drSelectXiangLin = m_dt.Select(string.Format(" qsdh='{0}' OR zddh='{0}' OR qsdh='{1}' OR zddh='{1}' OR qdsmid is null OR zdsmid is null ", drSelect[0]["qsdh"].ToString(), drSelect[0]["zddh"].ToString())); foreach (DataRow dr in drSelectXiangLin)//一般需要去掉3条,选择管线,选择管线的两头管线 { m_dt.Rows.Remove(dr); } Point2D fenxiQidian; Point2D fenxiZhongdian; double fenxiGXqdgc = 0.0D; double fenxiGXzdgc = 0.0D; double zuiduanjuli = 0.0D; double chuizhijingju = 0.0D; DataRow drFinal; foreach (DataRow dr in m_dt.Rows) { drFinal = dtFinal.NewRow(); drFinal["gxsmid"] = m_selectSMID; drFinal["gxsmidfx"] = dr["smid"]; drFinal["bzspjj"] = m_jingju[0]; drFinal["bzczjj"] = m_jingju[1]; fenxiQidian = new Point2D(double.Parse(dr["qdsmx"].ToString()), double.Parse(dr["qdsmy"].ToString())); fenxiZhongdian = new Point2D(double.Parse(dr["zdsmx"].ToString()), double.Parse(dr["zdsmy"].ToString())); fenxiGXqdgc = double.Parse(dr["qdgc"].ToString()); fenxiGXzdgc = double.Parse(dr["zdgc"].ToString()); double fenxiGXgj = double.Parse(dr["gj"].ToString()) * 0.001; GeoLine fenxiGuanxian = new GeoLine(new Point2Ds(fenxiQidian, fenxiZhongdian)); //判断被搜索几何对象是否与搜索几何对象分离。分离返回true。 bool isDisjointed = Geometrist.IsDisjointed(selectGuanxian, fenxiGuanxian); if (isDisjointed) //水平净距 { zuiduanjuli = Geometrist.Distance(fenxiGuanxian, selectGuanxian); zuiduanjuli = Math.Round(zuiduanjuli - selectGXgj * 0.5 - fenxiGXgj * 0.5, 2); if (zuiduanjuli < 0) zuiduanjuli = 0; drFinal["spjj"] = Math.Round(zuiduanjuli, 2).ToString(); drFinal["czjj"] = "未相交"; } else //垂直净距 { Point2D jiaodian = Geometrist.IntersectLine(selectQidian, selectZhongDian, fenxiQidian, fenxiZhongdian, false); double selectgc = ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, jiaodian); double fenxigc = ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, jiaodian); chuizhijingju = Math.Abs(selectgc - fenxigc); chuizhijingju = Math.Round(chuizhijingju - selectGXgj * 0.5 - fenxiGXgj * 0.5, 2); if (chuizhijingju < 0) chuizhijingju = 0; drFinal["czjj"] = Math.Round(chuizhijingju, 2).ToString(); drFinal["spjj"] = "相交"; } dtFinal.Rows.Add(drFinal); } if (dtFinal.Rows.Count == 0) { DataRow dr = dtFinal.NewRow(); dr[0] = "分析结果中没有发现不符合标准的管线"; dtFinal.Rows.Add(dr); } string hideTag = null; if (m_fenxileixing.Contains("水平净距分析")) hideTag = ",gxsmid,czjj,bzczjj,"; if (m_fenxileixing.Contains("垂直净距分析")) hideTag = ",gxsmid,spjj,bzspjj,"; ComsStatic.setUIDataGridView(uiDGVpz, dtFinal, null, hideTag); //判断搜索几何对象是否与被搜索几何对象有共同节点。有共同节点返回true //bool hasCommonPoint = Geometrist.HasCommonPoint(selectGuanxian, fenxiGuanxian); ////选择管线的起点 到分析管线的距离 ////double qidianDistance = Geometrist.Distance(new GeoPoint(selectQidian), fenxiGuanxian); //double qidianDistance = Geometrist.DistanceToLineSegment(selectQidian, fenxiQidian, fenxiZhongdian); ////选择管线的终点 到分析管线的距离 ////double zhongdianDistance = Geometrist.Distance(new GeoPoint(selectZhongDian), fenxiGuanxian); //double zhongdianDistance = Geometrist.DistanceToLineSegment(selectZhongDian, fenxiQidian, fenxiZhongdian); ////选择管线 到分析管线起点的距离 ////double Distanceqidian = Geometrist.Distance(new GeoPoint(fenxiQidian), selectGuanxian); //double Distanceqidian = Geometrist.DistanceToLineSegment(fenxiQidian, selectQidian, selectZhongDian); ////选择管线 到分析管线终点的距离 ////double Distancezhongdian = Geometrist.Distance(new GeoPoint(fenxiZhongdian), selectGuanxian); //double Distancezhongdian = Geometrist.DistanceToLineSegment(fenxiZhongdian, selectQidian, selectZhongDian); //zuiduanjuli = ComsStatic.getMaxMin(new double[] { qidianDistance, zhongdianDistance, Distanceqidian, Distancezhongdian }, false); #region 距离查询失败 Geometrist.NearestPointToVertex(Point2D,Geometry)方法 与实际不符 //由于Geometrist.NearestPointToVertex(Point2D,Geometry)方法 //说明是:从几何对象(目前仅支持线对象)上找一点与给定的点距离最近。 //但是经过测试,如果Geometry是线段的时候,会返回线段延长线上的点,而不是线段上的点。 //2021年10月29日 咨询客服后可以用 Geometrist.DistanceToLineSegment 方法 (Point2D, Point2D, Point2D)计算已知点到已知线段的距离 //if (zuiduanjuli == qidianDistance)//选择管线的起点 到分析管线的距离 最短 //{ // fenxiJuliDian = Geometrist.NearestPointToVertex(selectQidian, fenxiGuanxian); // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, fenxiJuliDian); // chuizhijingju = Math.Abs(selectGXzdgc - fenxiJuliDian_gc); //} //else if (zuiduanjuli == zhongdianDistance)//选择管线的终点 到分析管线的距离 最短 //{ // fenxiJuliDian = Geometrist.NearestPointToVertex(selectZhongDian, fenxiGuanxian); // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, fenxiJuliDian); // chuizhijingju = Math.Abs(selectGXqdgc - fenxiJuliDian_gc); //} //else if (zuiduanjuli == Distanceqidian)//选择管线 到分析管线起点的距离 最短 //{ // fenxiJuliDian = Geometrist.NearestPointToVertex(fenxiQidian, selectGuanxian); // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, fenxiJuliDian); // chuizhijingju = Math.Abs(fenxiGXqdgc - fenxiJuliDian_gc); //} //else if (zuiduanjuli == Distancezhongdian)//选择管线 到分析管线终点的距离 最短 //{ // fenxiJuliDian = Geometrist.NearestPointToVertex(fenxiZhongdian, selectGuanxian); // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, fenxiJuliDian); // chuizhijingju = Math.Abs(fenxiGXzdgc - fenxiJuliDian_gc); //} //else //{ // // Geometrist.Distance(new GeoPoint(fenxiZhongdian), new GeoPoint(fenxiJuliDian)) //} //double shuipingjuli = Math.Sqrt(Math.Pow(zuiduanjuli, 2.0) - Math.Pow(chuizhijingju, 2.0)); #endregion //验证 最短距离是否等于 zuiduanjuli //double zuiduanduli_1 = Geometrist.Distance(new GeoPoint(fenxiJuliDian), new GeoPoint(selectJuliDian)); //double zuiduanduli_2 = Geometrist.Distance(fenxiGuanxian, selectGuanxian); //验证 选择距离点是否在 选择线上 //bool IsPointOnLine_1 = Geometrist.IsPointOnLine(selectJuliDian, selectQidian, selectZhongDian, false); //验证 分析距离点是否在 分析线上 //bool IsPointOnLine_2 = Geometrist.IsPointOnLine(fenxiJuliDian, fenxiQidian, fenxiZhongdian, false); } private void uiDGVpz_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { double spjj = double.TryParse(uiDGVpz.Rows[e.RowIndex].Cells[2].Value.ToString(), out spjj) ? spjj : double.NaN; double bzspjj = double.Parse(uiDGVpz.Rows[e.RowIndex].Cells[3].Value.ToString()); if (spjj < bzspjj && spjj != double.NaN) uiDGVpz.Rows[e.RowIndex].Cells[2].Style.ForeColor = Color.Red; double czjj = double.TryParse(uiDGVpz.Rows[e.RowIndex].Cells[4].Value.ToString(), out czjj) ? czjj : double.NaN; double bzczjj = double.Parse(uiDGVpz.Rows[e.RowIndex].Cells[5].Value.ToString()); if (czjj < bzczjj && czjj != double.NaN) uiDGVpz.Rows[e.RowIndex].Cells[4].Style.ForeColor = Color.Red; } private void uiDGVpz_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { if (uiDGVpz.SelectedRows == null || uiDGVpz.SelectedRows.Count != 1) return; int smid = ComsStatic.StringToInt(uiDGVpz.SelectedRows[0].Cells["gxsmidfx"].Value); if (smid == 0) return; var fs = ComsStatic.gsGuanXian.GetAllFeatures(); if (!fs.ContainsKey(smid)) return; Geometry geoxy = fs[smid].GetGeometry(); new DoTrackingPoint().Doing(geoxy.InnerPoint.X, geoxy.InnerPoint.Y); } } }