| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- 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" };
- DataColumn dataColumn;
- dataColumn = new DataColumn { ColumnName = "gxsmid", Caption = "选中管线编号" }; dtFinal.Columns.Add(dataColumn);
- dataColumn = new DataColumn { ColumnName = "gxsmidfx", Caption = "分析管线编号" }; dtFinal.Columns.Add(dataColumn);
- dataColumn = new DataColumn { ColumnName = "spjj", Caption = "水平净距" }; dtFinal.Columns.Add(dataColumn);
- dataColumn = new DataColumn { ColumnName = "bzspjj", Caption = "标准水平净距" }; dtFinal.Columns.Add(dataColumn);
- dataColumn = new DataColumn { ColumnName = "czjj", Caption = "垂直净距" }; dtFinal.Columns.Add(dataColumn);
- dataColumn = new DataColumn { ColumnName = "bzczjj", Caption = "标准垂直净距" }; dtFinal.Columns.Add(dataColumn);
- //选择的管线,只能有一条
- DataRow[] drSelect = m_dt.Select(string.Format(" smid='{0}' and qdgc<>'' and zdgc<>'' ", m_selectSMID.ToString()));
- if (drSelect.Length != 1) { Sunny.UI.UIMessageTip.ShowError("当前选择管线缺少配置,无法完成分析!"); this.Close(); return; }
- if (string.IsNullOrEmpty(drSelect[0]["qdsmid"].ToString()) || string.IsNullOrEmpty(drSelect[0]["zdsmid"].ToString()))
- {
- ComsStatic.ShowErrorLog(string.Format("当前选择管线SMID='{0}'缺少起始点号或终点点号的管点信息", m_selectSMID)); 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 = ",czjj,bzczjj,";
- if (m_fenxileixing.Contains("垂直净距分析")) hideTag = ",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;
- }
- }
- }
|