PengZhuangAnalystResult.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. dtFinal.Columns.Add(new DataColumn { ColumnName = "gxsmid", Caption = "选中管线编号" });
  44. dtFinal.Columns.Add(new DataColumn { ColumnName = "gxsmidfx", Caption = "分析管线编号" });
  45. dtFinal.Columns.Add(new DataColumn { ColumnName = "spjj", Caption = "水平净距" });
  46. dtFinal.Columns.Add(new DataColumn { ColumnName = "bzspjj", Caption = "标准水平净距" });
  47. dtFinal.Columns.Add(new DataColumn { ColumnName = "czjj", Caption = "垂直净距" });
  48. dtFinal.Columns.Add(new DataColumn { ColumnName = "bzczjj", Caption = "标准垂直净距" });
  49. //选择的管线,只能有一条
  50. DataRow[] drSelect = m_dt.Select(string.Format(" smid='{0}' and qdgc<>'' and zdgc<>'' and qdsmid<>'' and zdsmid<>'' ", m_selectSMID.ToString()));
  51. if (drSelect.Length != 1) { Sunny.UI.UIMessageTip.ShowError("当前选择管线缺少配置,无法完成分析!"); this.Close(); return; }
  52. Point2D selectQidian = new Point2D(double.Parse(drSelect[0]["qdsmx"].ToString()), double.Parse(drSelect[0]["qdsmy"].ToString()));
  53. Point2D selectZhongDian = new Point2D(double.Parse(drSelect[0]["zdsmx"].ToString()), double.Parse(drSelect[0]["zdsmy"].ToString()));
  54. GeoLine selectGuanxian = new GeoLine(new Point2Ds(selectQidian, selectZhongDian));
  55. double selectGXgj = double.Parse(drSelect[0]["gj"].ToString()) * 0.001;
  56. double selectGXqdgc = double.Parse(drSelect[0]["qdgc"].ToString());
  57. double selectGXzdgc = double.Parse(drSelect[0]["zdgc"].ToString());
  58. //这里不仅去掉选择管线,去掉管线的两头管线,同时去掉 没有起始点号和终点点号的管线
  59. 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()));
  60. foreach (DataRow dr in drSelectXiangLin)//一般需要去掉3条,选择管线,选择管线的两头管线
  61. {
  62. m_dt.Rows.Remove(dr);
  63. }
  64. Point2D fenxiQidian;
  65. Point2D fenxiZhongdian;
  66. double fenxiGXqdgc = 0.0D;
  67. double fenxiGXzdgc = 0.0D;
  68. double zuiduanjuli = 0.0D;
  69. double chuizhijingju = 0.0D;
  70. DataRow drFinal;
  71. foreach (DataRow dr in m_dt.Rows)
  72. {
  73. drFinal = dtFinal.NewRow();
  74. drFinal["gxsmid"] = m_selectSMID; drFinal["gxsmidfx"] = dr["smid"]; drFinal["bzspjj"] = m_jingju[0]; drFinal["bzczjj"] = m_jingju[1];
  75. fenxiQidian = new Point2D(double.Parse(dr["qdsmx"].ToString()), double.Parse(dr["qdsmy"].ToString()));
  76. fenxiZhongdian = new Point2D(double.Parse(dr["zdsmx"].ToString()), double.Parse(dr["zdsmy"].ToString()));
  77. fenxiGXqdgc = double.Parse(dr["qdgc"].ToString());
  78. fenxiGXzdgc = double.Parse(dr["zdgc"].ToString());
  79. double fenxiGXgj = double.Parse(dr["gj"].ToString()) * 0.001;
  80. GeoLine fenxiGuanxian = new GeoLine(new Point2Ds(fenxiQidian, fenxiZhongdian));
  81. //判断被搜索几何对象是否与搜索几何对象分离。分离返回true。
  82. bool isDisjointed = Geometrist.IsDisjointed(selectGuanxian, fenxiGuanxian);
  83. if (isDisjointed) //水平净距
  84. {
  85. zuiduanjuli = Geometrist.Distance(fenxiGuanxian, selectGuanxian);
  86. zuiduanjuli = Math.Round(zuiduanjuli - selectGXgj * 0.5 - fenxiGXgj * 0.5, 2);
  87. if (zuiduanjuli < 0) zuiduanjuli = 0;
  88. drFinal["spjj"] = Math.Round(zuiduanjuli, 2).ToString();
  89. drFinal["czjj"] = "未相交";
  90. }
  91. else //垂直净距
  92. {
  93. Point2D jiaodian = Geometrist.IntersectLine(selectQidian, selectZhongDian, fenxiQidian, fenxiZhongdian, false);
  94. double selectgc = ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, jiaodian);
  95. double fenxigc = ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, jiaodian);
  96. chuizhijingju = Math.Abs(selectgc - fenxigc);
  97. chuizhijingju = Math.Round(chuizhijingju - selectGXgj * 0.5 - fenxiGXgj * 0.5, 2);
  98. if (chuizhijingju < 0) chuizhijingju = 0;
  99. drFinal["czjj"] = Math.Round(chuizhijingju, 2).ToString();
  100. drFinal["spjj"] = "相交";
  101. }
  102. dtFinal.Rows.Add(drFinal);
  103. }
  104. if (dtFinal.Rows.Count == 0)
  105. {
  106. DataRow dr = dtFinal.NewRow(); dr[0] = "分析结果中没有发现不符合标准的管线"; dtFinal.Rows.Add(dr);
  107. }
  108. string hideTag = null;
  109. if (m_fenxileixing.Contains("水平净距分析")) hideTag = ",gxsmid,czjj,bzczjj,";
  110. if (m_fenxileixing.Contains("垂直净距分析")) hideTag = ",gxsmid,spjj,bzspjj,";
  111. ComsStatic.setUIDataGridView(uiDGVpz, dtFinal, null, hideTag);
  112. //判断搜索几何对象是否与被搜索几何对象有共同节点。有共同节点返回true
  113. //bool hasCommonPoint = Geometrist.HasCommonPoint(selectGuanxian, fenxiGuanxian);
  114. ////选择管线的起点 到分析管线的距离
  115. ////double qidianDistance = Geometrist.Distance(new GeoPoint(selectQidian), fenxiGuanxian);
  116. //double qidianDistance = Geometrist.DistanceToLineSegment(selectQidian, fenxiQidian, fenxiZhongdian);
  117. ////选择管线的终点 到分析管线的距离
  118. ////double zhongdianDistance = Geometrist.Distance(new GeoPoint(selectZhongDian), fenxiGuanxian);
  119. //double zhongdianDistance = Geometrist.DistanceToLineSegment(selectZhongDian, fenxiQidian, fenxiZhongdian);
  120. ////选择管线 到分析管线起点的距离
  121. ////double Distanceqidian = Geometrist.Distance(new GeoPoint(fenxiQidian), selectGuanxian);
  122. //double Distanceqidian = Geometrist.DistanceToLineSegment(fenxiQidian, selectQidian, selectZhongDian);
  123. ////选择管线 到分析管线终点的距离
  124. ////double Distancezhongdian = Geometrist.Distance(new GeoPoint(fenxiZhongdian), selectGuanxian);
  125. //double Distancezhongdian = Geometrist.DistanceToLineSegment(fenxiZhongdian, selectQidian, selectZhongDian);
  126. //zuiduanjuli = ComsStatic.getMaxMin(new double[] { qidianDistance, zhongdianDistance, Distanceqidian, Distancezhongdian }, false);
  127. #region 距离查询失败 Geometrist.NearestPointToVertex(Point2D,Geometry)方法 与实际不符
  128. //由于Geometrist.NearestPointToVertex(Point2D,Geometry)方法
  129. //说明是:从几何对象(目前仅支持线对象)上找一点与给定的点距离最近。
  130. //但是经过测试,如果Geometry是线段的时候,会返回线段延长线上的点,而不是线段上的点。
  131. //2021年10月29日 咨询客服后可以用 Geometrist.DistanceToLineSegment 方法 (Point2D, Point2D, Point2D)计算已知点到已知线段的距离
  132. //if (zuiduanjuli == qidianDistance)//选择管线的起点 到分析管线的距离 最短
  133. //{
  134. // fenxiJuliDian = Geometrist.NearestPointToVertex(selectQidian, fenxiGuanxian);
  135. // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, fenxiJuliDian);
  136. // chuizhijingju = Math.Abs(selectGXzdgc - fenxiJuliDian_gc);
  137. //}
  138. //else if (zuiduanjuli == zhongdianDistance)//选择管线的终点 到分析管线的距离 最短
  139. //{
  140. // fenxiJuliDian = Geometrist.NearestPointToVertex(selectZhongDian, fenxiGuanxian);
  141. // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(fenxiQidian, fenxiGXqdgc, fenxiZhongdian, fenxiGXzdgc, fenxiJuliDian);
  142. // chuizhijingju = Math.Abs(selectGXqdgc - fenxiJuliDian_gc);
  143. //}
  144. //else if (zuiduanjuli == Distanceqidian)//选择管线 到分析管线起点的距离 最短
  145. //{
  146. // fenxiJuliDian = Geometrist.NearestPointToVertex(fenxiQidian, selectGuanxian);
  147. // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, fenxiJuliDian);
  148. // chuizhijingju = Math.Abs(fenxiGXqdgc - fenxiJuliDian_gc);
  149. //}
  150. //else if (zuiduanjuli == Distancezhongdian)//选择管线 到分析管线终点的距离 最短
  151. //{
  152. // fenxiJuliDian = Geometrist.NearestPointToVertex(fenxiZhongdian, selectGuanxian);
  153. // fenxiJuliDian_gc = MapBasic.ComsStatic.getPointHeight(selectQidian, selectGXqdgc, selectZhongDian, selectGXzdgc, fenxiJuliDian);
  154. // chuizhijingju = Math.Abs(fenxiGXzdgc - fenxiJuliDian_gc);
  155. //}
  156. //else
  157. //{
  158. // // Geometrist.Distance(new GeoPoint(fenxiZhongdian), new GeoPoint(fenxiJuliDian))
  159. //}
  160. //double shuipingjuli = Math.Sqrt(Math.Pow(zuiduanjuli, 2.0) - Math.Pow(chuizhijingju, 2.0));
  161. #endregion
  162. //验证 最短距离是否等于 zuiduanjuli
  163. //double zuiduanduli_1 = Geometrist.Distance(new GeoPoint(fenxiJuliDian), new GeoPoint(selectJuliDian));
  164. //double zuiduanduli_2 = Geometrist.Distance(fenxiGuanxian, selectGuanxian);
  165. //验证 选择距离点是否在 选择线上
  166. //bool IsPointOnLine_1 = Geometrist.IsPointOnLine(selectJuliDian, selectQidian, selectZhongDian, false);
  167. //验证 分析距离点是否在 分析线上
  168. //bool IsPointOnLine_2 = Geometrist.IsPointOnLine(fenxiJuliDian, fenxiQidian, fenxiZhongdian, false);
  169. }
  170. private void uiDGVpz_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  171. {
  172. double spjj = double.TryParse(uiDGVpz.Rows[e.RowIndex].Cells[2].Value.ToString(), out spjj) ? spjj : double.NaN;
  173. double bzspjj = double.Parse(uiDGVpz.Rows[e.RowIndex].Cells[3].Value.ToString());
  174. if (spjj < bzspjj && spjj != double.NaN)
  175. uiDGVpz.Rows[e.RowIndex].Cells[2].Style.ForeColor = Color.Red;
  176. double czjj = double.TryParse(uiDGVpz.Rows[e.RowIndex].Cells[4].Value.ToString(), out czjj) ? czjj : double.NaN;
  177. double bzczjj = double.Parse(uiDGVpz.Rows[e.RowIndex].Cells[5].Value.ToString());
  178. if (czjj < bzczjj && czjj != double.NaN)
  179. uiDGVpz.Rows[e.RowIndex].Cells[4].Style.ForeColor = Color.Red;
  180. }
  181. private void uiDGVpz_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
  182. {
  183. if (uiDGVpz.SelectedRows == null || uiDGVpz.SelectedRows.Count != 1) return;
  184. int smid = ComsStatic.StringToInt(uiDGVpz.SelectedRows[0].Cells["gxsmidfx"].Value);
  185. if (smid == 0) return;
  186. var fs = ComsStatic.gsGuanXian.GetAllFeatures();
  187. if (!fs.ContainsKey(smid)) return;
  188. Geometry geoxy = fs[smid].GetGeometry();
  189. new DoTrackingPoint().Doing(geoxy.InnerPoint.X, geoxy.InnerPoint.Y);
  190. }
  191. }
  192. }