ComsStatic.cs 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  1. using Sunny.UI;
  2. using SuperMap.Data;
  3. using SuperMap.Layout;
  4. using SuperMap.Mapping;
  5. using SuperMap.UI;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Net;
  13. using System.Security.Cryptography;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using System.Windows.Forms;
  17. using WeifenLuo.WinFormsUI.Docking;
  18. using WWPipeLine.Commons;
  19. namespace WWPipeLine.MapBasic
  20. {
  21. public class ComsStatic
  22. {
  23. //public static ComsStatic Instance { get => new ComsStatic(); }
  24. private static ComsStatic m_Instance;
  25. public static ComsStatic Instance
  26. {
  27. get
  28. {
  29. if (m_Instance == null)
  30. m_Instance = new ComsStatic();
  31. return m_Instance;
  32. }
  33. }
  34. private static Workspace m_Workspace;
  35. public void SetWorkspace(Workspace ws) { m_Workspace = ws; }
  36. private static MapControl m_MapControl;
  37. public void SetMapControl(MapControl mp) { m_MapControl = mp; }
  38. private static DockPanel m_DockPanel;
  39. public void SetDockPanel(DockPanel dp) { m_DockPanel = dp; }
  40. private static IMessageInterface m_IMessageInterface;
  41. public void SetIMessageInterface(IMessageInterface mi) { m_IMessageInterface = mi; }
  42. public static IMessageInterface MessageInterface { get => m_IMessageInterface; }
  43. #region 用户信息
  44. public void SetUserID(int uid) { m_UserID = uid; }
  45. private static int m_UserID;
  46. public static int UserID { get => m_UserID; }
  47. public void SetUserName(string uNick) { m_UserNick = uNick; }
  48. private static string m_UserNick;
  49. public static string UserNick { get => m_UserNick; }
  50. public void SetLoginID(int uid) { m_LoginID = uid; }
  51. private static int m_LoginID;
  52. public static int LoginID { get => m_LoginID; }
  53. #endregion
  54. #region Workspace MapControl DatasetVector
  55. /// <summary>
  56. /// 工作空间的地图索引值 配置在ini文件中WorkspaceMapIndex
  57. /// </summary>
  58. public static Int32 WorkspaceMapIndex
  59. {
  60. get
  61. {
  62. string index = IniHelper.Read(IniHelper.KEY_WorkspaceMapIndex_PATH);
  63. return StringToInt(index);
  64. }
  65. }
  66. /// <summary>
  67. /// 工作空间的数据源索引值 配置在ini文件中WorkspaceDatasourceIndex
  68. /// </summary>
  69. private static Int32 WorkspaceDatasourceIndex
  70. {
  71. get
  72. {
  73. string index = IniHelper.Read(IniHelper.KEY_WorkspaceDatasourceIndex_PATH);
  74. return StringToInt(index);
  75. }
  76. }
  77. public static Datasource Datasource { get => m_Workspace.Datasources[WorkspaceDatasourceIndex]; }
  78. public static Workspace Workspace { get => m_Workspace; }
  79. public static MapControl MapControl { get => m_MapControl; }
  80. public static DockPanel DockPanel { get => m_DockPanel; }
  81. /// <summary>
  82. /// 配置表
  83. /// </summary>
  84. public static DatasetVector dvJSLK_PZ { get => Datasource.Datasets["JSLK_PZ"] as DatasetVector; }
  85. /// <summary>
  86. /// 供水节点表
  87. /// </summary>
  88. public static DatasetVector dvJSJDPT { get => Datasource.Datasets["JSJDPT"] as DatasetVector; }
  89. /// <summary>
  90. /// 供水管线表
  91. /// </summary>
  92. public static DatasetVector dvJSLK { get => Datasource.Datasets["JSLK"] as DatasetVector; }
  93. public static DatasetVector dsGuanDian { get => Datasource.Datasets["GSGD"] as DatasetVector; }
  94. public static DatasetVector dvFM
  95. {
  96. get
  97. {
  98. if (Datasource.Datasets.Contains("dvFM"))
  99. Datasource.Datasets.Delete("dvFM");
  100. return Datasource.Datasets.CreateAndAppendWithSmid("dvFM", dsGuanDian.Query(" fldm='阀门' ", CursorType.Static));
  101. }
  102. }
  103. public static Layer LayerGuanXian
  104. {
  105. get
  106. {
  107. LayerGroup lg = m_MapControl.Map.Layers.FindLayer("LayerGroup") as LayerGroup;
  108. if (lg.Count == 0) return null;
  109. Layer lyr = null;
  110. foreach (Layer lyrr in lg)
  111. {
  112. if (lyrr.Dataset == dvJSLK) { lyr = lyrr; break; }
  113. }
  114. return lyr;
  115. }
  116. }
  117. //public static Layers MapLayers { get => m_MapControl.Map.Layers; }
  118. /// <summary>
  119. /// 管点管线图层 LayerGroup
  120. /// </summary>
  121. public static List<Layer> MapLayers
  122. {
  123. get
  124. {
  125. List<Layer> layerList = new List<Layer>();
  126. LayerGroup lg = m_MapControl.Map.Layers.FindLayer("LayerGroup") as LayerGroup;
  127. if (lg.Count == 0) return null;
  128. foreach (Layer lyrr in lg)
  129. {
  130. if (lyrr.Dataset == null || lyrr.Dataset.Datasource.Alias != Datasource.Alias) continue;
  131. layerList.Add(lyrr);
  132. }
  133. return layerList;
  134. }
  135. }
  136. /// <summary>
  137. /// 管点管线图层 + 用水单位图层
  138. /// </summary>
  139. public static List<Layer> MapLayersUsed
  140. {
  141. get
  142. {
  143. List<Layer> layerList = MapLayers;
  144. LayerGroup lg = m_MapControl.Map.Layers.FindLayer("LayerGroup#1") as LayerGroup;
  145. foreach (Layer lyrr in lg)
  146. {
  147. if (lyrr.Dataset == null || lyrr.Dataset.Datasource.Alias != Datasource.Alias) continue;
  148. if (!",unitpy,".ToLower().Contains(lyrr.Dataset.Name.ToLower())) continue;
  149. layerList.Add(lyrr);
  150. }
  151. return layerList;
  152. }
  153. }
  154. /// <summary>
  155. /// 当前数据集的所有图层
  156. /// </summary>
  157. public static List<Layer> MapLayersAll
  158. {
  159. get
  160. {
  161. List<Layer> layerList = new List<Layer>();
  162. foreach (Layer lyr in m_MapControl.Map.Layers)
  163. {
  164. if (lyr.Name.ToLower().Contains("layergroup"))
  165. {
  166. LayerGroup lyrG = lyr as LayerGroup;
  167. foreach (Layer lyrr in lyrG.Layers)
  168. {
  169. if (lyrr.Dataset.Datasource.Alias == Datasource.Alias)
  170. layerList.Add(lyrr);
  171. }
  172. }
  173. else if (lyr.Dataset.Datasource.Alias == Datasource.Alias)
  174. {
  175. layerList.Add(lyr);
  176. }
  177. }
  178. return layerList;
  179. }
  180. }
  181. public static DataTable getLayers()
  182. {
  183. DataTable dt = new DataTable { TableName = "LayersDataTable" };
  184. dt.Columns.Add("LayerName"); dt.Columns.Add("LayerCaption"); dt.Columns.Add("LayerDatasetName");
  185. DataRow dataRow;
  186. foreach (Layer r in MapLayers)
  187. {
  188. dataRow = dt.NewRow();
  189. dataRow[0] = r.Name;
  190. dataRow[1] = r.Caption;
  191. dataRow[2] = r.Dataset.Name;
  192. dt.Rows.Add(dataRow);
  193. }
  194. return dt;
  195. }
  196. public static void SetLayersIsSelectableFalse(string layerName, bool isSelect)
  197. {
  198. foreach (Layer r in MapLayers)
  199. {
  200. if (r.Name == layerName || r.Caption == layerName || r.Dataset.Name == layerName)
  201. r.IsSelectable = isSelect;
  202. else
  203. r.IsSelectable = !isSelect;
  204. }
  205. }
  206. public static void SetLayersIsVisibleFalse(string layerName, bool isSelect)
  207. {
  208. foreach (Layer r in MapLayers)
  209. {
  210. if (r.Name == layerName || r.Caption == layerName || r.Dataset.Name == layerName)
  211. r.IsVisible = isSelect;
  212. else
  213. r.IsVisible = !isSelect;
  214. }
  215. }
  216. /// <summary>
  217. /// 依据TrackingLayer的Name清空
  218. /// </summary>
  219. /// <param name="tag"></param>
  220. public static void TrackingLayerRemove(string tag)
  221. {
  222. int index = MapControl.Map.TrackingLayer.IndexOf(tag);
  223. while (index != -1)
  224. {
  225. MapControl.Map.TrackingLayer.Remove(index);
  226. index = MapControl.Map.TrackingLayer.IndexOf(tag);
  227. }
  228. }
  229. /// <summary>
  230. /// 关闭当前主程序中除了Tag=MainControls的其他所有窗体
  231. /// <para>默认4个主要窗体: 主窗体 工具栏 鹰眼 图层</para>
  232. /// </summary>
  233. public static void closeFormTagMainControls()
  234. {
  235. try
  236. {
  237. foreach (Form form in Application.OpenForms)
  238. {
  239. if (form.Tag?.ToString() != "MainControls" && form.Text?.ToString() != "工具栏")
  240. {
  241. form.Close(); break;
  242. }
  243. }
  244. if (Application.OpenForms.Count > 6)
  245. {
  246. closeFormTagMainControls();
  247. }
  248. }
  249. catch (Exception ex)
  250. {
  251. ComsStatic.ShowErrorLog(ex);
  252. }
  253. }
  254. #endregion
  255. #region SuperMap.Data相关操作
  256. public static readonly string[] resultFieldsGX = new string[] { "fldm", "cz", "gj", "cd", "yl", "msfs", "dzms", "qsdw", "tcdw" };
  257. public static readonly string[] resultFields = new string[] { "fldm", "fsw", "xh", "gg", "cz", "kj", "gj", "yl", "dmgc", "ms", "msfs", "dzms", "qsdw", "tcdw" };
  258. public static Recordset QueryRecordset(DatasetVector dv, string sqlWhere, string[] resultFields = null, string[] groupBy = null, string[] orderBy = null)
  259. {
  260. QueryParameter para = new QueryParameter();
  261. if (sqlWhere != null) para.AttributeFilter = sqlWhere;
  262. if (resultFields != null) para.ResultFields = Commons.StringEx.setToLower(resultFields);
  263. if (groupBy != null) para.GroupBy = Commons.StringEx.setToLower(groupBy);
  264. if (orderBy != null) para.OrderBy = Commons.StringEx.setToLower(orderBy);
  265. para.CursorType = CursorType.Static;
  266. return dv.Query(para);
  267. }
  268. public static Recordset QueryRecordsetDynamic(DatasetVector dv, string sqlWhere, string[] resultFields = null, string[] groupBy = null, string[] orderBy = null)
  269. {
  270. QueryParameter para = new QueryParameter();
  271. if (sqlWhere != null) para.AttributeFilter = sqlWhere;
  272. if (resultFields != null) para.ResultFields = Commons.StringEx.setToLower(resultFields);
  273. if (groupBy != null) para.GroupBy = Commons.StringEx.setToLower(groupBy);
  274. if (orderBy != null) para.OrderBy = Commons.StringEx.setToLower(orderBy);
  275. para.CursorType = CursorType.Dynamic;
  276. return dv.Query(para);
  277. }
  278. public static DataTable QueryDataTable(DatasetVector dv, string sqlWhere, string[] resultFields = null, string[] groupBy = null, string[] orderBy = null)
  279. {
  280. QueryParameter para = new QueryParameter();
  281. if (sqlWhere != null) para.AttributeFilter = sqlWhere;
  282. if (resultFields != null) para.ResultFields = Commons.StringEx.setToLower(resultFields);
  283. if (groupBy != null) para.GroupBy = Commons.StringEx.setToLower(groupBy);
  284. if (orderBy != null) para.OrderBy = Commons.StringEx.setToLower(orderBy);
  285. para.CursorType = CursorType.Static;
  286. Recordset rd = dv.Query(para);
  287. return RecordsetToDataTable(rd, dv.Name);
  288. }
  289. public static List<object> QueryFieldsValueList(DatasetVector dv, string sqlWhere, string resultFields, string[] groupBy = null, string[] orderBy = null)
  290. {
  291. Recordset rd = QueryRecordset(dv, sqlWhere, new string[] { resultFields }, groupBy, orderBy);
  292. List<object> result = new List<object>();
  293. rd.MoveFirst();
  294. if (!rd.IsEOF)
  295. {
  296. result.Add(rd.GetFieldValue(resultFields));
  297. rd.MoveNext();
  298. }
  299. return result;
  300. }
  301. public static DataTable RecordsetToDataTable(Recordset recordset, string tableName = null)
  302. {
  303. if (string.IsNullOrEmpty(tableName)) tableName = recordset.Dataset.Name;
  304. DataTable dt = new DataTable { TableName = tableName };
  305. FieldInfos fieldInfos = recordset.GetFieldInfos();
  306. Int32 count = fieldInfos.Count;
  307. DataColumn dataColumn;
  308. for (Int32 i = 0; i < count; i++)
  309. {
  310. dataColumn = new DataColumn { ColumnName = fieldInfos[i].Name, Caption = fieldInfos[i].Caption };
  311. dt.Columns.Add(dataColumn);
  312. }
  313. recordset.MoveFirst();
  314. Int32 length = recordset.RecordCount;
  315. DataRow dr;
  316. for (int i = 0; i < length; i++)
  317. {
  318. dr = dt.NewRow();
  319. var actIndex = 0;
  320. for (Int32 j = 0; j < count; j++)
  321. {
  322. var objValue = recordset.GetFieldValue(j);
  323. string value = objValue?.ToString();
  324. dr[actIndex++] = value;
  325. }
  326. dt.Rows.Add(dr);
  327. recordset.MoveNext();
  328. }
  329. return dt;
  330. }
  331. public static List<DataTable> TongJiFieldGroupCount(DatasetVector dv, string[] strField)
  332. {
  333. Recordset rd = null;
  334. List<DataTable> dts = new List<DataTable>();
  335. DataTable dt;
  336. DataRow dr;
  337. string fieldValue = string.Empty;
  338. foreach (string field in strField)
  339. {
  340. string[] ck = new string[] { field };
  341. rd = ComsStatic.QueryRecordset(dv, null, ck, ck, ck);
  342. dt = new DataTable(); dt.Columns.Add("类别"); dt.Columns.Add("数量");
  343. if (!HasField(dv, field)) continue;
  344. dt.TableName = rd.GetFieldInfos()[field].Caption;
  345. if (rd.RecordCount == 0)//该字段所有值均为null 不能GroupBy
  346. {
  347. dr = dt.NewRow();
  348. dr["类别"] = "未知"; dr["数量"] = dv.RecordCount;
  349. dt.Rows.Add(dr);
  350. }
  351. else
  352. {
  353. rd.MoveFirst();
  354. while (!rd.IsEOF)
  355. {
  356. dr = dt.NewRow();
  357. fieldValue = rd.GetFieldValue(field)?.ToString();
  358. if (string.IsNullOrEmpty(fieldValue))
  359. {
  360. dr["类别"] = "未知";
  361. dr["数量"] = dv.Query(string.Format("{0} is null", field), CursorType.Static).RecordCount;
  362. }
  363. else
  364. {
  365. dr["类别"] = fieldValue;
  366. dr["数量"] = dv.Query(string.Format("{0}='{1}'", field, fieldValue), CursorType.Static).RecordCount;
  367. }
  368. dt.Rows.Add(dr);
  369. rd.MoveNext();
  370. }
  371. }
  372. dr = dt.NewRow();
  373. dr["类别"] = dt.TableName + "总量"; dr["数量"] = dv.RecordCount;
  374. dt.Rows.Add(dr);
  375. dts.Add(dt);
  376. }
  377. ComsStatic.RecordsetDispose(rd);
  378. return dts;
  379. }
  380. public static string getSqlCheckListBox(Dictionary<string, CheckedListBox> dic)
  381. {
  382. StringBuilder sb = new StringBuilder(" 1=1 ");
  383. foreach (string key in dic.Keys)
  384. {
  385. if (dic[key].CheckedItems.Count > 0)
  386. {
  387. sb.Append(" AND (1=2 ");
  388. foreach (string clbItem in dic[key].CheckedItems)
  389. {
  390. if (clbItem == "未知")
  391. sb.AppendFormat(" OR {0} is null ", key);
  392. else
  393. sb.AppendFormat(" OR {0}='{1}' ", key, clbItem);
  394. }
  395. sb.Append(" ) ");
  396. }
  397. }
  398. return sb.ToString();
  399. }
  400. /// <summary>
  401. /// 获取DatasetVector的FieldInfos数组 不包含系统字段
  402. /// </summary>
  403. /// <param name="dv"></param>
  404. /// <returns></returns>
  405. public static string[] GetFieldInfos(DatasetVector dv)
  406. {
  407. List<string> listStr = new List<string>();
  408. foreach (FieldInfo f in dv.FieldInfos)
  409. {
  410. if (f.IsSystemField) continue;
  411. listStr.Add(f.Name);
  412. }
  413. return listStr.ToArray();
  414. }
  415. public static bool HasField(DatasetVector m_DatasetVector, string _field)
  416. {
  417. bool hasField = false;
  418. FieldInfos fieldInfos = m_DatasetVector.FieldInfos;
  419. for (int i = 0; i < fieldInfos.Count; i++)
  420. {
  421. if (fieldInfos[i].Name.ToLower() == _field.ToLower())
  422. {
  423. hasField = true; break;
  424. }
  425. }
  426. return hasField;
  427. }
  428. public static bool HasField(Recordset m_Recordset, string _field)
  429. {
  430. bool hasField = false;
  431. FieldInfos fieldInfos = m_Recordset.GetFieldInfos();
  432. for (int i = 0; i < fieldInfos.Count; i++)
  433. {
  434. if (fieldInfos[i].Name.ToLower() == _field.ToLower())
  435. {
  436. hasField = true; break;
  437. }
  438. }
  439. return hasField;
  440. }
  441. public static void RecordsetDispose(Recordset rd)
  442. {
  443. if (rd != null) { rd.Close(); rd.Dispose(); }
  444. }
  445. public static void EditHistoryUndo(EditHistory eh)
  446. {
  447. while (eh.CanUndo) { eh.Undo(); }
  448. eh.Clear(); eh.Dispose();
  449. }
  450. public static DataTable GetJSLKbyJSJDPT(DataTable dt)
  451. {
  452. #region 构造 管线的起始管点和终点管点 信息
  453. DataColumn dataColumn;
  454. dataColumn = new DataColumn { ColumnName = "qdsmid", Caption = "起点SmID" }; dt.Columns.Add(dataColumn);
  455. dataColumn = new DataColumn { ColumnName = "qdsmx", Caption = "起点X坐标" }; dt.Columns.Add(dataColumn);
  456. dataColumn = new DataColumn { ColumnName = "qdsmy", Caption = "起点Y坐标" }; dt.Columns.Add(dataColumn);
  457. dataColumn = new DataColumn { ColumnName = "qddmgc", Caption = "起点地面高程" }; dt.Columns.Add(dataColumn);
  458. dataColumn = new DataColumn { ColumnName = "qdgdms", Caption = "起点埋深" }; dt.Columns.Add(dataColumn);
  459. dataColumn = new DataColumn { ColumnName = "qdgc", Caption = "起点高程" }; dt.Columns.Add(dataColumn);
  460. dataColumn = new DataColumn { ColumnName = "zdsmid", Caption = "终点SmID" }; dt.Columns.Add(dataColumn);
  461. dataColumn = new DataColumn { ColumnName = "zdsmx", Caption = "终点X坐标" }; dt.Columns.Add(dataColumn);
  462. dataColumn = new DataColumn { ColumnName = "zdsmy", Caption = "终点Y坐标" }; dt.Columns.Add(dataColumn);
  463. dataColumn = new DataColumn { ColumnName = "zddmgc", Caption = "终点地面高程" }; dt.Columns.Add(dataColumn);
  464. dataColumn = new DataColumn { ColumnName = "zdgdms", Caption = "终点埋深" }; dt.Columns.Add(dataColumn);
  465. dataColumn = new DataColumn { ColumnName = "zdgc", Caption = "终点高程" }; dt.Columns.Add(dataColumn);
  466. #endregion
  467. DataTable dtJSJDPT;
  468. foreach (DataRow dr in dt.Rows)
  469. {
  470. dtJSJDPT = QueryDataTable(dvJSJDPT, string.Format(" bsm='{0}' ", dr["qsdh"]));
  471. if (dtJSJDPT.Rows.Count == 1)
  472. {
  473. dr["qdsmid"] = dtJSJDPT.Rows[0]["smid"]; dr["qdsmx"] = dtJSJDPT.Rows[0]["x"]; dr["qdsmy"] = dtJSJDPT.Rows[0]["y"];
  474. dr["qddmgc"] = dtJSJDPT.Rows[0]["dmgc"]; dr["qdgdms"] = dtJSJDPT.Rows[0]["ms"];
  475. //dr["qdgc"] = Math.Round(double.Parse(dtJSJDPT.Rows[0]["dmgc"]?.ToString()) - double.Parse(dtJSJDPT.Rows[0]["ms"]?.ToString()), 2);
  476. dr["qdgc"] = StringToDouble(dtJSJDPT.Rows[0]["dmgc"], 2) - StringToDouble(dtJSJDPT.Rows[0]["ms"], 2);
  477. }
  478. dtJSJDPT = QueryDataTable(dvJSJDPT, string.Format(" bsm='{0}' ", dr["zddh"]));
  479. if (dtJSJDPT.Rows.Count == 1)
  480. {
  481. dr["zdsmid"] = dtJSJDPT.Rows[0]["smid"]; dr["zdsmx"] = dtJSJDPT.Rows[0]["x"]; dr["zdsmy"] = dtJSJDPT.Rows[0]["y"];
  482. dr["zddmgc"] = dtJSJDPT.Rows[0]["dmgc"]; dr["zdgdms"] = dtJSJDPT.Rows[0]["ms"];
  483. //dr["zdgc"] = Math.Round(double.Parse(dtJSJDPT.Rows[0]["dmgc"]?.ToString()) - double.Parse(dtJSJDPT.Rows[0]["ms"]?.ToString()), 2);
  484. dr["zdgc"] = StringToDouble(dtJSJDPT.Rows[0]["dmgc"], 2) - StringToDouble(dtJSJDPT.Rows[0]["ms"], 2);
  485. }
  486. }
  487. return dt;
  488. }
  489. public static Dictionary<string, object> getGuanXianPeiZhi(string pzlx)
  490. {
  491. DatasetVector dv = ComsStatic.dvJSLK_PZ;
  492. Dictionary<string, object> dic = new Dictionary<string, object>();
  493. Recordset _rd = dv.Query(string.Format(" pzlx='{0}' ", pzlx), CursorType.Static);
  494. if (_rd.RecordCount == 0) return dic;
  495. _rd.MoveFirst();
  496. while (!_rd.IsEOF)
  497. {
  498. string gxcz = _rd.GetFieldValue("gxcz").ToString();
  499. dic.Add(gxcz + "_gxyjnx", _rd.GetFieldValue("gxyjnx"));
  500. dic.Add(gxcz + "_gxbznx", _rd.GetFieldValue("gxbznx"));
  501. dic.Add(gxcz + "_gxms", _rd.GetFieldValue("gxms"));
  502. _rd.MoveNext();
  503. }
  504. return dic;
  505. }
  506. public static double GetMaxValue(DatasetVector dv, string fieldName)
  507. {
  508. return dv.Statistic(fieldName, StatisticMode.Max);
  509. }
  510. public static int GetMaxValueInt(DatasetVector dv, string fieldName)
  511. {
  512. return StringToInt(dv.Statistic(fieldName, StatisticMode.Max));
  513. }
  514. public static object GetOnlyValueByField(DatasetVector dv, string sqlWhere, string field)
  515. {
  516. Recordset rd = dv.Query(sqlWhere, CursorType.Static);
  517. if (rd is null || rd.RecordCount != 1) return null;
  518. return rd.GetFieldValue(field);
  519. }
  520. /// <summary>
  521. /// 在当前的DatasetVector中,获取指定列名的最小值
  522. /// </summary>
  523. /// <param name="fieldName"></param>
  524. /// <returns></returns>
  525. public static double GetMinValue(DatasetVector dv, string fieldName)
  526. {
  527. return dv.Statistic(fieldName, StatisticMode.Min);
  528. }
  529. #endregion
  530. #region ShowUIMessageTip界面提示信息
  531. public static void ShowUIMessageTipOKorError(bool _result, string msg, string logMsg = "")
  532. {
  533. if (_result)
  534. {
  535. ShowOKLog(msg + "操作成功!", logMsg);
  536. }
  537. else
  538. {
  539. ShowErrorLog(msg + "操作失败!", logMsg);
  540. }
  541. }
  542. public static void ShowErrorLog(object msg, string logMsg = "")
  543. {
  544. LogHelper.Error(string.Format("{0}.{1}", msg, logMsg));
  545. UIMessageTip.ShowError(msg.ToString(), 2000, false, new Point(800, 400), true);
  546. }
  547. public static void ShowOK(string msg)
  548. {
  549. UIMessageTip.ShowOk(msg, 2000, false, new Point(800, 400), true);
  550. }
  551. public static void ShowOKLog(object msg, string logMsg = "")
  552. {
  553. pgAddLoginm(string.Format("{0}.{1}", msg, logMsg));
  554. LogHelper.Info(string.Format("{0}.{1}", msg, logMsg));
  555. UIMessageTip.ShowOk(msg.ToString(), 2000, false, new Point(800, 400), true);
  556. }
  557. #endregion
  558. #region String操作
  559. public static double StringToDouble(object str, int dleng = -1)
  560. {
  561. if (str is null) return 0;
  562. double result = 0.0D;
  563. double.TryParse(str.ToString(), out result);
  564. if (dleng != -1)
  565. {
  566. result = Math.Round(result, dleng);
  567. }
  568. return result;
  569. }
  570. /// <summary>
  571. /// Object转Int Ojbect=null或者转换失败时返回0;
  572. /// </summary>
  573. /// <param name="str"></param>
  574. /// <returns></returns>
  575. public static int StringToInt(object str)
  576. {
  577. if (str is null) return 0;
  578. Int32 result = 0;
  579. Int32.TryParse(str.ToString(), out result);
  580. return result;
  581. }
  582. public static Int16 StringToInt16(object str)
  583. {
  584. if (str is null) return 0;
  585. Int16 result = 0;
  586. Int16.TryParse(str.ToString(), out result);
  587. return result;
  588. }
  589. public static float StringToFloat(object str)
  590. {
  591. if (str is null) return 0.0F;
  592. float result = 0.0F;
  593. float.TryParse(str.ToString(), out result);
  594. return result;
  595. }
  596. public static string GetStrAddChar(object str, char ch)
  597. {
  598. return ch + str.ToString() + ch;
  599. }
  600. public static string getMd5Hash(string input, string key)
  601. {
  602. MD5 md5Hasher = MD5.Create();
  603. string str = input + key;
  604. byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(str));
  605. StringBuilder sBuilder = new StringBuilder();
  606. for (int i = 0; i < data.Length; i++)
  607. {
  608. sBuilder.Append(data[i].ToString("x2"));
  609. }
  610. return sBuilder.ToString();
  611. }
  612. #endregion
  613. #region SummyUI的控件设置和数据绑定
  614. public static readonly UIStyle uiStyleCom = UIStyle.Blue; //R 80 G 160 B 255
  615. public static readonly string HideEnableTag = ",smid,smx,smy,smkey,smsdriw,smsdrin,smsdrie,smsdris,smgranule,SmGeometry,smlength,smtopoerror,smlibtileid,smperimeter,smarea,smnodeid,smuserid,objectid,bsm,wth,tfh,dmt,x,y,dinggc,digc,cqbh,tsdh,ssbh,ROTATEANGLE,lrrq,enabled,zcbh,qdms,zdms,shape_length,shape_area,lx,qsdh,zddh,fmlx,sblx,sbsl,sbdz,qdsmid,qdsmx,qdsmy,zdsmid,zdsmx,zdsmy,".ToLower();
  616. public static void setUIDataGridView(UIDataGridView dgv, DataTable dt = null, string showTag = null, string hideTag = null)
  617. {
  618. dgv.Dock = DockStyle.Fill;
  619. dgv.ShowEditingIcon = false;
  620. dgv.ShowCellToolTips = false;
  621. dgv.AllowUserToAddRows = false;
  622. dgv.AllowUserToResizeRows = false;
  623. dgv.AllowUserToDeleteRows = false;
  624. dgv.AllowUserToOrderColumns = false;
  625. dgv.ReadOnly = true;
  626. dgv.MultiSelect = false;
  627. dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  628. dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
  629. dgv.Style = UIStyle.Gray;// ComsStatic.uiStyleCom;
  630. //dgv.RowPostPaint += Dgv_RowPostPaint;
  631. if (dt != null)
  632. {
  633. dgv.DataSource = dt;
  634. if (showTag != null)
  635. {
  636. string[] strShow = showTag.ToLower().Split(',');
  637. int indexStr = 0;
  638. for (int i = 0; i < dgv.Columns.Count; i++)
  639. {
  640. dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  641. dgv.Columns[i].HeaderText = dt.Columns[i].Caption;
  642. indexStr = strShow.ToList().IndexOf(dgv.Columns[i].Name.ToLower());
  643. if (indexStr > -1)
  644. dgv.Columns[i].DisplayIndex = indexStr;
  645. else
  646. dgv.Columns[i].Visible = false;
  647. }
  648. return;
  649. }
  650. if (string.IsNullOrEmpty(hideTag))
  651. {
  652. for (int i = 0; i < dgv.Columns.Count; i++)
  653. {
  654. dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  655. dgv.Columns[i].HeaderText = dt.Columns[i].Caption;
  656. if (HideEnableTag.Contains("," + dgv.Columns[i].Name.ToLower() + ","))
  657. {
  658. dgv.Columns[i].Visible = false;
  659. }
  660. }
  661. }
  662. else
  663. {
  664. for (int i = 0; i < dgv.Columns.Count; i++)
  665. {
  666. dgv.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  667. dgv.Columns[i].HeaderText = dt.Columns[i].Caption;
  668. if (HideEnableTag.Contains("," + dgv.Columns[i].Name.ToLower() + ",") || hideTag.ToLower().Contains("," + dgv.Columns[i].Name.ToLower() + ","))
  669. {
  670. dgv.Columns[i].Visible = false;
  671. }
  672. }
  673. }
  674. }
  675. }
  676. private static void Dgv_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
  677. {
  678. var dgv = sender as DataGridView;
  679. Rectangle rect = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth - 4, e.RowBounds.Height);
  680. TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dgv.RowHeadersDefaultCellStyle.Font, rect, dgv.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
  681. }
  682. public static void BindUICombox(UIComboBox cbx)
  683. {
  684. foreach (Layer lyr in ComsStatic.MapLayers)
  685. {
  686. cbx.Items.Add(new DoListItem(lyr.Dataset.Name, lyr.Caption));
  687. }
  688. cbx.SelectedIndex = 0;
  689. }
  690. public static void BindDataTableOnCheckedListBox(DatasetVector _dv, CheckedListBox _cbg, string _ziduan)
  691. {
  692. Recordset rd = QueryRecordset(_dv, null, new string[] { _ziduan }, new string[] { _ziduan }, new string[] { _ziduan });
  693. rd.MoveFirst();
  694. string fieldValue = string.Empty;
  695. _cbg.Items.Clear();
  696. while (!rd.IsEOF)
  697. {
  698. fieldValue = rd.GetFieldValue(_ziduan)?.ToString();
  699. if (string.IsNullOrEmpty(fieldValue))
  700. _cbg.Items.Add("未知");
  701. else
  702. _cbg.Items.Add(fieldValue);
  703. rd.MoveNext();
  704. }
  705. }
  706. public static void BindDataTableOnComboBox(DatasetVector _dv, UIComboBox _cbg, string _ziduan)
  707. {
  708. Recordset rd = QueryRecordset(_dv, null, new string[] { _ziduan }, new string[] { _ziduan }, new string[] { _ziduan });
  709. rd.MoveFirst();
  710. _cbg.Items.Clear();
  711. string fieldValue = string.Empty;
  712. while (!rd.IsEOF)
  713. {
  714. fieldValue = rd.GetFieldValue(_ziduan)?.ToString();
  715. if (string.IsNullOrEmpty(fieldValue))
  716. _cbg.Items.Add("未知");
  717. else
  718. _cbg.Items.Add(fieldValue);
  719. rd.MoveNext();
  720. }
  721. }
  722. public static DataTable getPaperSize()
  723. {
  724. DataTable dt = new DataTable { TableName = "PaperSizeTable" };
  725. dt.Columns.Add("sizekey"); dt.Columns.Add("sizedesc");
  726. dt.Rows.Add("A4", "A4 210x297mm");
  727. dt.Rows.Add("A3", "A3 297x420mm");
  728. dt.Rows.Add("ISOA2", "标准纸面大小(A2)");
  729. dt.Rows.Add("ISOA1", "标准纸面大小(A1)");
  730. dt.Rows.Add("ISOA0", "标准纸面大小(A0)");
  731. return dt;
  732. }
  733. public static PaperSize getPaperSize(string size)
  734. {
  735. PaperSize ps = PaperSize.A4;
  736. switch (size)
  737. {
  738. case "A4": ps = PaperSize.A4; break;
  739. case "A3": ps = PaperSize.A3; break;
  740. case "ISOA2": ps = PaperSize.ISOA2; break;
  741. case "ISOA1": ps = PaperSize.ISOA1; break;
  742. case "ISOA0": ps = PaperSize.ISOA0; break;
  743. default: break;
  744. }
  745. return ps;
  746. }
  747. /// <summary>
  748. /// 设置CheckedListBox的选择状态 1全选 2反选 3全不选
  749. /// </summary>
  750. /// <param name="clb"></param>
  751. /// <param name="doState">1全选 2反选 3全不选</param>
  752. public static void CheckListBoxDo(CheckedListBox clb, int doState)
  753. {
  754. switch (doState)
  755. {
  756. case 1://全选
  757. for (int i = 0; i < clb.Items.Count; i++)
  758. {
  759. clb.SetItemChecked(i, true);
  760. }
  761. break;
  762. case 2://反选
  763. for (int i = 0; i < clb.Items.Count; i++)
  764. {
  765. bool ck = clb.GetItemChecked(i);
  766. clb.SetItemChecked(i, !ck);
  767. }
  768. break;
  769. case 3://全不选
  770. for (int i = 0; i < clb.Items.Count; i++)
  771. {
  772. clb.SetItemChecked(i, false);
  773. }
  774. break;
  775. default:
  776. break;
  777. }
  778. }
  779. private static ToolTip toolTips = new ToolTip();
  780. public static void CheckedListBox_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
  781. {
  782. CheckedListBox clb = sender as CheckedListBox;
  783. int index = clb.IndexFromPoint(e.X, e.Y);
  784. //if (index != -1)
  785. if (index != -1 && toolTips.GetToolTip(clb) != clb.Items[index].ToString())
  786. {
  787. toolTips.SetToolTip(clb, clb.Items[index].ToString());
  788. }
  789. }
  790. public static void UIListBox_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
  791. {
  792. UIListBox clb = sender as UIListBox;
  793. int index = clb.IndexFromPoint(e.X, e.Y);
  794. if (index != -1 && toolTips.GetToolTip(clb) != clb.Items[index].ToString())
  795. {
  796. toolTips.SetToolTip(clb, clb.Items[index].ToString());
  797. }
  798. }
  799. #endregion
  800. #region 其他计算操作
  801. /// <summary>
  802. /// 通过起点的坐标和数值、终点的坐标和数值,计算线上交点的数值
  803. /// </summary>
  804. /// <param name="gx_start">起点坐标</param>
  805. /// <param name="gx_start_gc">起点数值</param>
  806. /// <param name="gx_end">终点坐标</param>
  807. /// <param name="gx_end_gc">终点数值</param>
  808. /// <param name="JiaoDian">线上的交点坐标</param>
  809. /// <returns>交点数值</returns>
  810. public static double getPointHeight(Point2D start, double startValue, Point2D end, double endValue, Point2D JiaoDian)
  811. {
  812. if (!Geometrist.IsPointOnLine(JiaoDian, start, end, false)) return 0.0;
  813. if (startValue == endValue) return Math.Round(startValue, 2);
  814. double JiaoDianValue = 0.0D;
  815. if (startValue < endValue)//确保起点数据 大于 终点数据
  816. {
  817. double temp = startValue;
  818. startValue = endValue;
  819. endValue = temp;
  820. Point2D temPoint = start;
  821. start = end;
  822. end = temPoint;
  823. }
  824. // 参考链接 https://zhuanlan.zhihu.com/p/43660758 下面的公式可以用,是正式的,这里备份一下
  825. //JiaoDian_gc = gx_end_gc + (gx_start_gc - gx_end_gc) * (Math.Sqrt(Math.Pow((JiaoDian.X - gx_end.X), 2.0) + Math.Pow((JiaoDian.Y - gx_end.Y), 2.0))) / (Math.Sqrt(Math.Pow((gx_start.X - gx_end.X), 2.0) + Math.Pow((gx_start.Y - gx_end.Y), 2.0)));
  826. JiaoDianValue = endValue + (startValue - endValue) * (Math.Sqrt(Math.Pow((JiaoDian.X - end.X), 2.0) + Math.Pow((JiaoDian.Y - end.Y), 2.0))) / (Math.Sqrt(Math.Pow((start.X - end.X), 2.0) + Math.Pow((start.Y - end.Y), 2.0)));
  827. if (JiaoDianValue == double.PositiveInfinity || JiaoDianValue == double.NegativeInfinity)
  828. {
  829. JiaoDianValue = endValue;
  830. }
  831. return Math.Round(JiaoDianValue, 2);
  832. }
  833. /// <summary>
  834. /// 返回Double数组的最大值或者最小值
  835. /// </summary>
  836. /// <param name="dblist"></param>
  837. /// <param name="isMax">True表示最大值,false表示最小值</param>
  838. /// <returns></returns>
  839. public static double getMaxMin(double[] dblist, bool isMax)
  840. {
  841. double finalValue = dblist[0];
  842. if (isMax)//最大值
  843. {
  844. for (int i = 0; i < dblist.Length; i++)
  845. {
  846. if (finalValue < dblist[i])
  847. finalValue = dblist[i];
  848. }
  849. }
  850. else
  851. {
  852. for (int i = 0; i < dblist.Length; i++)
  853. {
  854. if (finalValue > dblist[i])
  855. finalValue = dblist[i];
  856. }
  857. }
  858. return finalValue;
  859. }
  860. /// <summary>
  861. /// 将逗号分隔的csv格式文件,转换为DataTable
  862. /// </summary>
  863. /// <param name="filePath">csv文件路径</param>
  864. /// <param name="FirstField">首行是否是标题行</param>
  865. /// <returns></returns>
  866. public static DataTable CSVToDataTable(string filePath, bool FirstField)
  867. {
  868. DataTable table = new DataTable();
  869. bool isField = true;
  870. using (StreamReader reader = new StreamReader(filePath, Encoding.GetEncoding("gb2312"), false))
  871. {
  872. string line = string.Empty;
  873. while (reader.Peek() > 0)
  874. {
  875. line = reader.ReadLine();
  876. if (string.IsNullOrEmpty(line) || line.Split(',').Length == 0) continue;
  877. string[] split = line.Split(',');
  878. if (isField)
  879. {
  880. isField = false;
  881. if (FirstField)//首行是标题
  882. {
  883. foreach (string str in split) table.Columns.Add(str);
  884. continue;
  885. }
  886. else
  887. {
  888. for (int i = 0; i < split.Length; i++) table.Columns.Add("列" + i.ToString());
  889. }
  890. }
  891. DataRow newRow = table.NewRow();
  892. for (int j = 0; j < split.Length; j++)
  893. {
  894. newRow[j] = split[j].Trim('"');
  895. }
  896. table.Rows.Add(newRow);
  897. }
  898. return table;
  899. }
  900. }
  901. #endregion
  902. #region postgresSql
  903. /// <summary>
  904. /// 获取本机所有IPV4地址列表
  905. /// </summary>
  906. /// <returns>本机所有IPV4地址列表,以分号分隔</returns>
  907. public static string GetSelfIpv4List()
  908. {
  909. StringBuilder ips = new StringBuilder();
  910. try
  911. {
  912. IPHostEntry IpEntry = Dns.GetHostEntry(Dns.GetHostName());
  913. foreach (IPAddress ipa in IpEntry.AddressList)
  914. {
  915. if (ipa.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
  916. { ips.AppendFormat("{0};", ipa.ToString()); break; }
  917. }
  918. }
  919. catch { }
  920. return ips.ToString();
  921. }
  922. public static string GetSql(string select, List<string> wheres, string orderby = null, string groupby = null)
  923. {
  924. StringBuilder sb = new StringBuilder(select);
  925. if (wheres.Count > 0)
  926. {
  927. sb.Append(" where " + string.Join(" and ", wheres.ToArray()));
  928. }
  929. if (!string.IsNullOrEmpty(orderby)) sb.Append(orderby);
  930. if (!string.IsNullOrEmpty(groupby)) sb.Append(groupby);
  931. return sb.ToString();
  932. }
  933. public static void pgAddLogin(string n, string p, string c)
  934. {
  935. string sql = string.Format(" INSERT INTO userlogin(lgName,lgtime,lgIP,lgCup)VALUES('{0}','{1}','{2}','{3}') returning id;", n, DateTime.Now.ToLocalTime(), p, c);
  936. object obj = new NpgsqlHelper().ExecuteScalar(sql);
  937. ComsStatic.Instance.SetLoginID(StringToInt(obj));
  938. }
  939. public static void pgAddLoginm(string n)
  940. {
  941. if (ComsStatic.LoginID == 0) return;
  942. string sql = string.Format(" INSERT INTO userloginm(lgid,czms,cztime)VALUES('{0}','{1}','{2}') returning id;", ComsStatic.LoginID, n, DateTime.Now.ToLocalTime());
  943. new NpgsqlHelper().ExecuteScalar(sql);
  944. }
  945. #endregion
  946. #region 管网标注的配置
  947. /// <summary>
  948. ///线样式 LineColor = Color.Brown, LineWidth = 0.5
  949. /// </summary>
  950. public static GeoStyle geoStyle_Brown_05mm = new GeoStyle() { LineColor = Color.Brown, LineWidth = 0.5 };
  951. /// <summary>
  952. ///点样式 LineColor = Color.Red, MarkerSize = new Size2D(5, 5)
  953. /// </summary>
  954. public static GeoStyle geoStyle_Red_Mark5mm = new GeoStyle { LineColor = Color.Red, MarkerSize = new Size2D(5, 5) };
  955. /// <summary>
  956. /// 标注样式 ForeColor = Color.Brown, IsSizeFixed = true, FontHeight = 6, Alignment = TextAlignment.BottomLeft
  957. /// </summary>
  958. public static TextStyle textStyle_Brown_6mm_BottomLeft = new TextStyle { ForeColor = Color.Brown, IsSizeFixed = true, FontHeight = 6, Alignment = TextAlignment.BottomLeft };
  959. /// <summary>
  960. ///边框线样式 LineColor = Color.Red, LineWidth = 1, FillOpaqueRate = 10
  961. /// </summary>
  962. public static GeoStyle geoStyle_Red_1mm_OpaqueRate = new GeoStyle { LineColor = Color.Red, LineWidth = 1, FillOpaqueRate = 10 };
  963. /// <summary>
  964. /// 获取标注风格配置的TextStyle
  965. /// </summary>
  966. /// <returns></returns>
  967. public static TextStyle BiaoZhuFengGe()
  968. {
  969. QueryParameter queryParameter = new QueryParameter
  970. {
  971. AttributeFilter = " pzlx='标注风格配置' and pzKey='TextStyleKey' ",
  972. ResultFields = new string[] { "pzValue" },
  973. CursorType = CursorType.Static
  974. };
  975. Recordset _rd = ComsStatic.dvJSLK_PZ.Query(queryParameter);
  976. if (_rd.RecordCount != 1) return textStyle_Brown_6mm_BottomLeft;
  977. TextStyle ts = new TextStyle();
  978. bool fromResult = ts.FromXML(_rd.GetFieldValue("pzValue").ToString());
  979. if (!fromResult) return textStyle_Brown_6mm_BottomLeft;
  980. return ts;
  981. }
  982. #endregion
  983. }
  984. public class DoListItem
  985. {
  986. private string _key = string.Empty;
  987. private string _value = string.Empty;
  988. public DoListItem(string pKey, string pValue) { _key = pKey; _value = pValue; }
  989. public override string ToString() { return _value; }
  990. public string Key { get => _key; set => _key = value; }
  991. public string Value { get => _value; set => _value = value; }
  992. }
  993. public class DoTrackingPoint
  994. {
  995. private Timer timer = new Timer() { Enabled = false, Interval = 300 };
  996. private int Timertag = 1;
  997. private GeoPoint markPoint = null;
  998. public void Doing(double x, double y)
  999. {
  1000. timer.Tick += Timer_Tick;
  1001. Point2D p2d = new Point2D(x, y);
  1002. ComsStatic.MapControl.Map.Center = p2d;
  1003. ComsStatic.MapControl.Map.Refresh();
  1004. markPoint = new GeoPoint(p2d);
  1005. markPoint.Style = new GeoStyle() { MarkerSize = new Size2D(5, 5), LineColor = Color.Red };
  1006. timer.Enabled = true; timer.Start();
  1007. }
  1008. private void Timer_Tick(object sender, EventArgs e)
  1009. {
  1010. if (Timertag == 6)
  1011. {
  1012. timer.Stop();
  1013. timer.Enabled = false;
  1014. Timertag = 1;
  1015. int index = ComsStatic.MapControl.Map.TrackingLayer.IndexOf("DoInterestPoint");
  1016. if (index > -1) ComsStatic.MapControl.Map.TrackingLayer.Remove(index);
  1017. ComsStatic.MapControl.Map.RefreshTrackingLayer();
  1018. return;
  1019. }
  1020. else if (Timertag % 2 == 1 && markPoint != null)
  1021. {
  1022. ComsStatic.MapControl.Map.TrackingLayer.Add(markPoint, "DoInterestPoint");
  1023. }
  1024. else //if (Timertag % 2 == 0)
  1025. {
  1026. int index = ComsStatic.MapControl.Map.TrackingLayer.IndexOf("DoInterestPoint");
  1027. if (index > -1) ComsStatic.MapControl.Map.TrackingLayer.Remove(index);
  1028. }
  1029. Timertag++;
  1030. ComsStatic.MapControl.Map.RefreshTrackingLayer();
  1031. }
  1032. }
  1033. }