PengZhuangAnalystResult.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. using SuperMap.Data;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using WWPipeLine.MapBasic;
  12. namespace WWPipeLine.MapTools.Conditions.AnalystToolBar
  13. {
  14. public partial class PengZhuangAnalystResult : Sunny.UI.UIForm
  15. {
  16. private DataTable m_dt;
  17. private double m_banjing;
  18. private string m_fenxileixing;
  19. private int m_selectSMID;
  20. private double[] m_jingju;
  21. public PengZhuangAnalystResult(DataTable dt, double banjing, string fenxileixing, int selectID, double[] _jingju)
  22. {
  23. InitializeComponent();
  24. this.StartPosition = FormStartPosition.Manual;
  25. this.Location = new System.Drawing.Point(10, 10);
  26. m_dt = dt; m_banjing = banjing; m_selectSMID = selectID; m_fenxileixing = GetFenxi(fenxileixing); m_jingju = _jingju;
  27. string GetFenxi(string vaaaa)
  28. {
  29. switch (vaaaa)
  30. {
  31. case "碰撞": return "碰撞分析(包括水平和垂直净距)";
  32. case "水平": return "水平净距分析(水平净距只分析与目标管线不想交的管线)";
  33. case "垂直": return "垂直净距分析(垂直净距只分析与目标管线相交的管线)";
  34. default: return "";
  35. }
  36. }
  37. //this.Text = string.Format("{0} 半径为{1}米 分析管线{2}根 选择管线SMID={3} ", m_fenxileixing, banjing, dt.Rows.Count, selectID);
  38. this.Text = m_fenxileixing;
  39. }
  40. private void PengZhuangAnalystResult_Load(object sender, EventArgs e)
  41. {
  42. DataTable dtFinal = new DataTable { TableName = "PengZhuangAnalystResultDataTable" };
  43. DataColumn dataColumn;
  44. dataColumn = new DataColumn { ColumnName = "gxsmid", Caption = "选中管线编号" }; dtFinal.Columns.Add(dataColumn);
  45. dataColumn = new DataColumn { ColumnName = "gxsmidfx", Caption = "分析管线编号" }; dtFinal.Columns.Add(dataColumn);
  46. dataColumn = new DataColumn { ColumnName = "spjj", Caption = "水平净距" }; dtFinal.Columns.Add(dataColumn);
  47. dataColumn = new DataColumn { ColumnName = "bzspjj", Caption = "标准水平净距" }; dtFinal.Columns.Add(dataColumn);
  48. dataColumn = new DataColumn { ColumnName = "czjj", Caption = "垂直净距" }; dtFinal.Columns.Add(dataColumn);
  49. dataColumn = new DataColumn { ColumnName = "bzczjj", Caption = "标准垂直净距" }; dtFinal.Columns.Add(dataColumn);
  50. //选择的管线,只能有一条
  51. DataRow[] drSelect = m_dt.Select(string.Format(" smid='{0}' and qdgc<>'' and zdgc<>'' ", m_selectSMID.ToString()));
  52. if (drSelect.Length != 1) { Sunny.UI.UIMessageTip.ShowError("当前选择管线缺少配置,无法完成分析!"); this.Close(); return; }
  53. if (string.IsNullOrEmpty(drSelect[0]["qdsmid"].ToString()) || string.IsNullOrEmpty(drSelect[0]["zdsmid"].ToString()))
  54. {
  55. ComsStatic.ShowErrorLog(string.Format("当前选择管线SMID='{0}'缺少起始点号或终点点号的管点信息", m_selectSMID)); this.Close(); return;
  56. }
  57. Point2D selectQidian = new Point2D(double.Parse(drSelect[0]["qdsmx"].ToString()), double.Parse(drSelect[0]["qdsmy"].ToString()));
  58. Point2D selectZhongDian = new Point2D(double.Parse(drSelect[0]["zdsmx"].ToString()), double.Parse(drSelect[0]["zdsmy"].ToString()));
  59. GeoLine selectGuanxian = new GeoLine(new Point2Ds(selectQidian, selectZhongDian));
  60. double selectGXgj = double.Parse(drSelect[0]["gj"].ToString()) * 0.001;
  61. double selectGXqdgc = double.Parse(drSelect[0]["qdgc"].ToString());
  62. double selectGXzdgc = double.Parse(drSelect[0]["zdgc"].ToString());
  63. //这里不仅去掉选择管线,去掉管线的两头管线,同时去掉 没有起始点号和终点点号的管线
  64. 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()));
  65. foreach (DataRow dr in drSelectXiangLin)//一般需要去掉3条,选择管线,选择管线的两头管线
  66. {
  67. m_dt.Rows.Remove(dr);
  68. }
  69. Point2D fenxiQidian;
  70. Point2D fenxiZhongdian;
  71. double fenxiGXqdgc = 0.0D;
  72. double fenxiGXzdgc = 0.0D;
  73. double zuiduanjuli = 0.0D;
  74. double chuizhijingju = 0.0D;
  75. DataRow drFinal;
  76. foreach (DataRow dr in m_dt.Rows)
  77. {
  78. drFinal = dtFinal.NewRow();
  79. drFinal["gxsmid"] = m_selectSMID; drFinal["gxsmidfx"] = dr["smid"]; drFinal["bzspjj"] = m_jingju[0]; drFinal["bzczjj"] = m_jingju[1];
  80. fenxiQidian = new Point2D(double.Parse(dr["qdsmx"].ToString()), double.Parse(dr["qdsmy"].ToString()));
  81. fenxiZhongdian = new Point2D(double.Parse(dr["zdsmx"].ToString()), double.Parse(dr["zdsmy"].ToString()));
  82. fenxiGXqdgc = double.Parse(dr["qdgc"].ToString());
  83. fenxiGXzdgc = double.Parse(dr["zdgc"].ToString());
  84. double fenxiGXgj = double.Parse(dr["gj"].ToString()) * 0.001;
  85. GeoLine fenxiGuanxian = new GeoLine(new Point2Ds(fenxiQidian, fenxiZhongdian));
  86. //判断被搜索几何对象是否与搜索几何对象分离。分离返回true。
  87. bool isDisjointed = Geometrist.IsDisjointed(selectGuanxian, fenxiGuanxian);
  88. if (isDisjointed) //水平净距
  89. {
  90. zuiduanjuli = Geometrist.Distance(fenxiGuanxian, selectGuanxian);
  91. zuiduanjuli = Math.Round(zuiduanjuli - selectGXgj * 0.5 - fenxiGXgj * 0.5, 2);
  92. if (zuiduanjuli < 0) zuiduanjuli = 0;
  93. drFinal["spjj"] = Math.Round(zuiduanjuli, 2).ToString();
  94. drFinal["czjj"] = "未相交";
  95. }
  96. else //垂直净距
  97. {
  98. Point2D jiaodian = Geometrist.IntersectLine(selectQidian, selectZhongDian, fenxiQidian, fenxiZhongdian, false);
  99. double selectgc = ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, jiaodian);
  100. double fenxigc = ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, jiaodian);
  101. chuizhijingju = Math.Abs(selectgc - fenxigc);
  102. chuizhijingju = Math.Round(chuizhijingju - selectGXgj * 0.5 - fenxiGXgj * 0.5, 2);
  103. if (chuizhijingju < 0) chuizhijingju = 0;
  104. drFinal["czjj"] = Math.Round(chuizhijingju, 2).ToString();
  105. drFinal["spjj"] = "相交";
  106. }
  107. dtFinal.Rows.Add(drFinal);
  108. }
  109. if (dtFinal.Rows.Count == 0)
  110. {
  111. DataRow dr = dtFinal.NewRow(); dr[0] = "分析结果中没有发现不符合标准的管线"; dtFinal.Rows.Add(dr);
  112. }
  113. string hideTag = null;
  114. if (m_fenxileixing.Contains("水平净距分析")) hideTag = ",czjj,bzczjj,";
  115. if (m_fenxileixing.Contains("垂直净距分析")) hideTag = ",spjj,bzspjj,";
  116. ComsStatic.setUIDataGridView(uiDGVpz, dtFinal, null, hideTag);
  117. //判断搜索几何对象是否与被搜索几何对象有共同节点。有共同节点返回true
  118. //bool hasCommonPoint = Geometrist.HasCommonPoint(selectGuanxian, fenxiGuanxian);
  119. ////选择管线的起点 到分析管线的距离
  120. ////double qidianDistance = Geometrist.Distance(new GeoPoint(selectQidian), fenxiGuanxian);
  121. //double qidianDistance = Geometrist.DistanceToLineSegment(selectQidian, fenxiQidian, fenxiZhongdian);
  122. ////选择管线的终点 到分析管线的距离
  123. ////double zhongdianDistance = Geometrist.Distance(new GeoPoint(selectZhongDian), fenxiGuanxian);
  124. //double zhongdianDistance = Geometrist.DistanceToLineSegment(selectZhongDian, fenxiQidian, fenxiZhongdian);
  125. ////选择管线 到分析管线起点的距离
  126. ////double Distanceqidian = Geometrist.Distance(new GeoPoint(fenxiQidian), selectGuanxian);
  127. //double Distanceqidian = Geometrist.DistanceToLineSegment(fenxiQidian, selectQidian, selectZhongDian);
  128. ////选择管线 到分析管线终点的距离
  129. ////double Distancezhongdian = Geometrist.Distance(new GeoPoint(fenxiZhongdian), selectGuanxian);
  130. //double Distancezhongdian = Geometrist.DistanceToLineSegment(fenxiZhongdian, selectQidian, selectZhongDian);
  131. //zuiduanjuli = ComsStatic.getMaxMin(new double[] { qidianDistance, zhongdianDistance, Distanceqidian, Distancezhongdian }, false);
  132. #region 距离查询失败 Geometrist.NearestPointToVertex(Point2D,Geometry)方法 与实际不符
  133. //由于Geometrist.NearestPointToVertex(Point2D,Geometry)方法
  134. //说明是:从几何对象(目前仅支持线对象)上找一点与给定的点距离最近。
  135. //但是经过测试,如果Geometry是线段的时候,会返回线段延长线上的点,而不是线段上的点。
  136. //2021年10月29日 咨询客服后可以用 Geometrist.DistanceToLineSegment 方法 (Point2D, Point2D, Point2D)计算已知点到已知线段的距离
  137. //if (zuiduanjuli == qidianDistance)//选择管线的起点 到分析管线的距离 最短
  138. //{
  139. // fenxiJuliDian = Geometrist.NearestPointToVertex(selectQidian, fenxiGuanxian);
  140. // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, fenxiJuliDian);
  141. // chuizhijingju = Math.Abs(selectGXzdgc - fenxiJuliDian_gc);
  142. //}
  143. //else if (zuiduanjuli == zhongdianDistance)//选择管线的终点 到分析管线的距离 最短
  144. //{
  145. // fenxiJuliDian = Geometrist.NearestPointToVertex(selectZhongDian, fenxiGuanxian);
  146. // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, fenxiJuliDian);
  147. // chuizhijingju = Math.Abs(selectGXqdgc - fenxiJuliDian_gc);
  148. //}
  149. //else if (zuiduanjuli == Distanceqidian)//选择管线 到分析管线起点的距离 最短
  150. //{
  151. // fenxiJuliDian = Geometrist.NearestPointToVertex(fenxiQidian, selectGuanxian);
  152. // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, fenxiJuliDian);
  153. // chuizhijingju = Math.Abs(fenxiGXqdgc - fenxiJuliDian_gc);
  154. //}
  155. //else if (zuiduanjuli == Distancezhongdian)//选择管线 到分析管线终点的距离 最短
  156. //{
  157. // fenxiJuliDian = Geometrist.NearestPointToVertex(fenxiZhongdian, selectGuanxian);
  158. // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, fenxiJuliDian);
  159. // chuizhijingju = Math.Abs(fenxiGXzdgc - fenxiJuliDian_gc);
  160. //}
  161. //else
  162. //{
  163. // // Geometrist.Distance(new GeoPoint(fenxiZhongdian), new GeoPoint(fenxiJuliDian))
  164. //}
  165. //double shuipingjuli = Math.Sqrt(Math.Pow(zuiduanjuli, 2.0) - Math.Pow(chuizhijingju, 2.0));
  166. #endregion
  167. //验证 最短距离是否等于 zuiduanjuli
  168. //double zuiduanduli_1 = Geometrist.Distance(new GeoPoint(fenxiJuliDian), new GeoPoint(selectJuliDian));
  169. //double zuiduanduli_2 = Geometrist.Distance(fenxiGuanxian, selectGuanxian);
  170. //验证 选择距离点是否在 选择线上
  171. //bool IsPointOnLine_1 = Geometrist.IsPointOnLine(selectJuliDian, selectQidian, selectZhongDian, false);
  172. //验证 分析距离点是否在 分析线上
  173. //bool IsPointOnLine_2 = Geometrist.IsPointOnLine(fenxiJuliDian, fenxiQidian, fenxiZhongdian, false);
  174. }
  175. private void uiDGVpz_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  176. {
  177. double spjj = double.TryParse(uiDGVpz.Rows[e.RowIndex].Cells[2].Value.ToString(), out spjj) ? spjj : double.NaN;
  178. double bzspjj = double.Parse(uiDGVpz.Rows[e.RowIndex].Cells[3].Value.ToString());
  179. if (spjj < bzspjj && spjj != double.NaN)
  180. uiDGVpz.Rows[e.RowIndex].Cells[2].Style.ForeColor = Color.Red;
  181. double czjj = double.TryParse(uiDGVpz.Rows[e.RowIndex].Cells[4].Value.ToString(), out czjj) ? czjj : double.NaN;
  182. double bzczjj = double.Parse(uiDGVpz.Rows[e.RowIndex].Cells[5].Value.ToString());
  183. if (czjj < bzczjj && czjj != double.NaN)
  184. uiDGVpz.Rows[e.RowIndex].Cells[4].Style.ForeColor = Color.Red;
  185. }
  186. }
  187. }