MergedparticlesHelper.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using OTSCommon.DBOperate;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Drawing.Imaging;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace OTSCommon
  12. {
  13. public class MergedparticlesHelper
  14. {
  15. private SqLiteHelper dbHelper;
  16. public MergedparticlesHelper(string path)
  17. {
  18. dbHelper = new SqLiteHelper("data source = '"+path+"'");
  19. }
  20. /// <summary>
  21. /// 获取ParticleList
  22. /// </summary>
  23. /// <param name="model">Feature</param>
  24. /// <returns></returns>
  25. public DataTable GetMergedParticles()
  26. {
  27. string sqlp = @"select *,
  28. (select group_concat(name||'-'||Percentage,';')
  29. from ElementChemistry where XRayId =MergedParticles.XRayId and fieldid=MergedParticles.fieldid ) as Element
  30. from MergedParticles ";
  31. DataTable DT = dbHelper.ExecuteQuery(sqlp);
  32. // List<Model.Particle> listp = dbHelper.TableToList<Model.Particle>(DT);
  33. return DT;
  34. }
  35. /// <summary>
  36. /// 获取所有Particle
  37. /// </summary>
  38. /// <returns></returns>
  39. public DataTable GetParticleAll(string fieldAndPartic)
  40. {
  41. string sqlp = @"select * from INcAData";
  42. if (fieldAndPartic != "")
  43. {
  44. sqlp = sqlp + " where '" + fieldAndPartic + "' like ('%,'||fieldid||'-'||particleid||',%')";
  45. }
  46. DataTable DT = dbHelper.ExecuteQuery(sqlp);
  47. return DT;
  48. }
  49. /// <summary>
  50. /// 通过FileStream 来打开文件,这样就可以实现不锁定Image文件,到时可以让多用户同时访问Image文件
  51. /// </summary>
  52. /// <param name="path"></param>
  53. /// <returns></returns>
  54. public Bitmap ReadImageFile(string path)
  55. {
  56. if (!File.Exists(path))
  57. {
  58. return null;//文件不存在
  59. }
  60. FileStream fs = File.OpenRead(path); //OpenRead
  61. int filelength = 0;
  62. filelength = (int)fs.Length; //获得文件长度
  63. Byte[] image = new Byte[filelength]; //建立一个字节数组
  64. fs.Read(image, 0, filelength); //按字节流读取
  65. System.Drawing.Image result = System.Drawing.Image.FromStream(fs);
  66. fs.Close();
  67. Bitmap bit = new Bitmap(result);
  68. return bit;
  69. }
  70. public Bitmap GetBitmapForBig(string sub, double xs, string path)
  71. {
  72. string vs = "," + sub.Replace(':', '-') + ",";
  73. DataTable dataTable = GetParticleAll(vs);
  74. if (dataTable.Rows.Count == 0)
  75. {
  76. return null;
  77. }
  78. //内接矩形
  79. double max_Y = Convert.ToInt64(dataTable.Rows[0]["FieldPosY"]) * xs - Convert.ToInt64(dataTable.Rows[0]["RectTop"]);
  80. double max_X = Convert.ToInt64(dataTable.Rows[0]["FieldPosX"]) * xs + Convert.ToInt64(dataTable.Rows[0]["RectLeft"]);
  81. double min_Y = max_Y;
  82. double min_X = max_X;
  83. //拼接field矩形
  84. double MAX_Y = Convert.ToInt64(dataTable.Rows[0]["FieldPosY"]) * xs;
  85. double MAX_X = Convert.ToInt64(dataTable.Rows[0]["FieldPosX"]) * xs;
  86. double MIN_Y = MAX_Y;
  87. double MIN_X = MAX_X;
  88. foreach (DataRow item in dataTable.Rows)
  89. {
  90. //颗粒外接矩形
  91. double lefttopX = Convert.ToInt64(item["FieldPosX"]) * xs + Convert.ToInt64(item["RectLeft"]);
  92. if (lefttopX < min_X)
  93. {
  94. min_X = lefttopX;
  95. }
  96. if (lefttopX + Convert.ToInt64(item["RectWidth"]) > max_X)
  97. {
  98. max_X = lefttopX + Convert.ToInt64(item["RectWidth"]);
  99. }
  100. double lrfttopY = Convert.ToInt64(item["FieldPosY"]) * xs - Convert.ToInt64(item["RectTop"]);
  101. if (max_Y < lrfttopY)
  102. {
  103. max_Y = lrfttopY;
  104. }
  105. if (min_Y > lrfttopY - Convert.ToInt64(item["RectHeight"]))
  106. {
  107. min_Y = lrfttopY - Convert.ToInt64(item["RectHeight"]);
  108. }
  109. //画布
  110. double lefttopXH = Convert.ToInt64(item["FieldPosX"]) * xs;
  111. if (lefttopXH > MAX_X)
  112. {
  113. MAX_X = lefttopXH;
  114. }
  115. if (lefttopXH < MIN_X)
  116. {
  117. MIN_X = lefttopXH;
  118. }
  119. double lrfttopYH = Convert.ToInt64(item["FieldPosY"]) * xs;
  120. if (MAX_Y < lrfttopYH)
  121. {
  122. MAX_Y = lrfttopYH;
  123. }
  124. if (MIN_Y > lrfttopYH)
  125. {
  126. MIN_Y = lrfttopYH;
  127. }
  128. }
  129. int WIDTH = Convert.ToInt32(MAX_X - MIN_X) + 1024;
  130. int HEIGHT = Convert.ToInt32(MAX_Y - MIN_Y) + 768;
  131. //构造最终的图片白板
  132. Bitmap tableChartImage = new Bitmap(WIDTH, HEIGHT);
  133. Graphics graph = Graphics.FromImage(tableChartImage);
  134. //初始化这个大图
  135. graph.DrawImage(tableChartImage, 0, 0);
  136. int width = Convert.ToInt32(max_X - min_X);
  137. int height = Convert.ToInt32(max_Y - min_Y);
  138. int X = Convert.ToInt32(min_X - MIN_X);
  139. int Y = Convert.ToInt32(MAX_Y - max_Y);
  140. Rectangle rectangle = new Rectangle() { X = X, Y = Y, Width = width, Height = height };
  141. foreach (DataRow item in dataTable.Rows)
  142. {
  143. string filePath = path + "\\FIELD_FILES\\";
  144. string imagePath = filePath + "Field" + item["fieldid"].ToString() + ".bmp";
  145. //然后将取出的数据,转换成Bitmap对象
  146. Bitmap ls_bt = ReadImageFile(imagePath);
  147. int x = Convert.ToInt32(Convert.ToDouble(item["FieldPosX"]) * xs - MIN_X);
  148. int y = Convert.ToInt32(Convert.ToDouble(item["FieldPosY"]) * xs - MIN_Y);
  149. try
  150. {
  151. graph.DrawImage(ls_bt, x, y);
  152. }
  153. catch /*(Exception e)*/
  154. {
  155. throw;
  156. }
  157. }
  158. Bitmap bmap = tableChartImage.Clone(rectangle, PixelFormat.Format8bppIndexed);
  159. // bmap.Save(path + "asd.bmp");
  160. return bmap;
  161. }
  162. }
  163. }