DisplayParticle.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  1. using OTSCommon.Model;
  2. using OTSIncAReportGraph.Class;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.Drawing.Drawing2D;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace OTSIncAReportGraph
  12. {
  13. /// <summary>
  14. /// Particle对象上操作状态的枚举,显示,不显示,已删除,已选择
  15. /// </summary>
  16. public enum PaintState
  17. {
  18. PAINT = 0,
  19. NOPAINT = 1,
  20. CONCISEPAINT=2,// display as a "+"
  21. }
  22. public enum DisplayState
  23. {
  24. DISPLAY = 0,
  25. NODISPLAY = 1,
  26. }
  27. /// <summary>
  28. /// Particle对象上操作xray的枚举状态,显示xray数据,不显示
  29. /// </summary>
  30. public enum ParticleShowXray
  31. {
  32. DISPLAYXRAY = 0,
  33. NODISPLAY = 1,
  34. }
  35. /// <summary>
  36. /// Segment对象绘制的枚举,以点绘制,还是以线绘制
  37. /// </summary>
  38. public enum SegmentShowMode
  39. {
  40. DRAWPARTICLEIMAGE = 0,
  41. DRAWLINE = 1,
  42. }
  43. /// <summary>
  44. /// 颗粒类
  45. /// </summary>
  46. public class DisplayParticle : ICloneable
  47. {
  48. private const float m_zoom_displayThreshold = 0.1f;
  49. public Particle objParticleData;
  50. private Guid m_id;
  51. private RectangleF m_rect;
  52. private PointF m_OTSPointF;
  53. private RectangleF m_smallRect;
  54. private bool m_isSelected_smallrect;
  55. private bool m_showSmallx;
  56. private bool m_isSelected;
  57. private bool m_isDeleted;
  58. private bool m_isMouseOver;
  59. private PaintState m_paintState = PaintState.PAINT;
  60. private ParticleShowXray m_operator_showxray = ParticleShowXray.NODISPLAY;//选定显示XRAY,不显示XRAY,默认应为(不显示XRAY)
  61. private bool m_isdragging;
  62. private PointF m_dragingpoint;
  63. private Color m_color;
  64. private GraphicsPath m_gpath;
  65. private List<DisplaySegment> m_listdsegment = new List<DisplaySegment>();
  66. private DisplayState m_displayState;
  67. private SegmentShowMode show_mode = SegmentShowMode.DRAWPARTICLEIMAGE;//绘线,绘点,默认绘点,意思为默认显示BSE原图像
  68. private Image m_image;
  69. private string m_sort_type = "从大到小";
  70. private float m_f_size = 0;
  71. private string m_str_lj = "颗粒粒级";
  72. private string m_str_klzl = "颗粒种类";
  73. private string m_str_klfl = "颗粒分类";
  74. private float m_CurrentZoomNum = 1;
  75. public int TypeId
  76. {
  77. get
  78. {
  79. return objParticleData.TypeId;
  80. }
  81. }
  82. //TypeName
  83. public string TypeName
  84. {
  85. get
  86. {
  87. return objParticleData.TypeName;
  88. }
  89. }
  90. //XRayId
  91. public int XRayId
  92. {
  93. get
  94. {
  95. return objParticleData.XrayId;
  96. }
  97. }
  98. public int SEMPosX
  99. {
  100. get
  101. {
  102. return objParticleData.SEMPosX;
  103. }
  104. }
  105. public int SEMPosY
  106. {
  107. get
  108. {
  109. return objParticleData.SEMPosY;
  110. }
  111. }
  112. public DisplayParticle()
  113. {
  114. m_id = System.Guid.NewGuid();
  115. }
  116. public DisplayParticle(Particle part)
  117. {
  118. m_id = System.Guid.NewGuid();
  119. objParticleData = part;
  120. this.Color = GetColorBySTDTypeIDForBSEAndSorImage(part.TypeColor, part.TypeId);
  121. }
  122. public DisplayParticle(Particle particle,Point screenPos,Bitmap originalFieldImage,Bitmap fieldParticleImage)
  123. {
  124. m_id = System.Guid.NewGuid();
  125. objParticleData = particle;
  126. this.Color = DrawFunction.GetColorBySTDTypeIDForBSEAndSorImage(particle.TypeColor, particle.TypeId);
  127. List<Segment> list_seg;
  128. list_seg = particle.SegmentList;
  129. //创建颗粒分布图对应的类对象
  130. List<DisplaySegment> list_dsegment = new List<DisplaySegment>();
  131. //再循环取出里面所有的segment
  132. foreach (Segment seg in list_seg)
  133. {
  134. #region 创建DSegment对象,并将STD分析出的化合物颜色保存到DSegment对象中
  135. //对Particle里的Segment进行偏移的计算等,创建了DSegment的大小
  136. DisplaySegment ds = new DisplaySegment();
  137. ds.SetShowRect(new Rectangle(seg.Start + screenPos.X,
  138. seg.Height + screenPos.Y,
  139. seg.Length,
  140. 1));
  141. ds.Color = this.Color;//将线的颜色对应到颗粒的颜色
  142. #endregion
  143. #region //这里是在Field中,抠取出原BSE图像到DSegment中--------------------------------
  144. //合成图像完成,开始抠取像素-----------------------------------------------------------------
  145. int f_length = seg.Length;
  146. for (int m = 0; m < f_length; m++)
  147. {
  148. //这里实现一下代码保护
  149. int lsjs_x = seg.Start + m;
  150. int lsjs_y = seg.Height;
  151. var pixelColor = originalFieldImage.GetPixel(lsjs_x, lsjs_y);
  152. fieldParticleImage.SetPixel(lsjs_x, lsjs_y, pixelColor);//ls_list_colors[m]
  153. }
  154. #endregion //------------------------------------------------------------------------------
  155. list_dsegment.Add(ds);
  156. }
  157. SetPaintState(PaintState.PAINT);
  158. m_listdsegment = list_dsegment;
  159. m_rect = GetRectFromDSegment();
  160. m_gpath = GetRegionFromDSegments();
  161. m_smallRect = GetSmallRectangleFromRect();
  162. var currentRect = new RectangleF(m_rect.X - screenPos.X, m_rect.Y - screenPos.Y, m_rect.Width, m_rect.Height);
  163. var dpImg = fieldParticleImage.Clone(currentRect, fieldParticleImage.PixelFormat);
  164. SetImage(dpImg);
  165. }
  166. public DisplayParticle(List<DisplaySegment> in_list_segment, DisplayParticle in_particle)
  167. {
  168. objParticleData = in_particle.objParticleData;
  169. m_id = in_particle.m_id;
  170. m_paintState = in_particle.m_paintState;
  171. m_operator_showxray = in_particle.m_operator_showxray;
  172. foreach (DisplaySegment e in in_list_segment)
  173. {
  174. m_listdsegment.Add(e.Clone() as DisplaySegment);
  175. }
  176. this.m_image = in_particle.m_image;
  177. m_rect = GetRectFromDSegment();
  178. m_smallRect = GetSmallRectangleFromRect();
  179. m_gpath = GetRegionFromDSegments();
  180. }
  181. /// <summary>
  182. /// 设置显示的方式,可以用,绘线显示查看标准库颜色的,也可以用绘点,查看BSE原图颗粒图色的
  183. /// </summary>
  184. public SegmentShowMode ShowMode
  185. {
  186. get { return show_mode; }
  187. set { show_mode = value; }
  188. }
  189. /// <summary>
  190. /// 克隆方法
  191. /// </summary>
  192. /// <returns></returns>
  193. public object Clone()
  194. {
  195. return new DisplayParticle(this.m_listdsegment, this);
  196. }
  197. public PointF GetCenterPoint()
  198. {
  199. return new PointF(m_rect.X + m_rect.Width / 2, m_rect.Y + m_rect.Height / 2);
  200. }
  201. /// <summary>
  202. /// ID
  203. /// </summary>
  204. public Guid guid
  205. {
  206. get { return m_id; }
  207. set { m_id = value; }
  208. }
  209. /// <summary>
  210. /// 颗粒的外边框大小
  211. /// </summary>
  212. public RectangleF GetShowRect()
  213. {
  214. m_rect= this.GetRectFromDSegment();
  215. return m_rect;
  216. }
  217. /// <summary>
  218. /// OTSPointF
  219. /// </summary>
  220. public PointF OTSPointF
  221. {
  222. get { return m_OTSPointF; }
  223. set { m_OTSPointF = value; }
  224. }
  225. /// <summary>
  226. /// 颗粒里+号位置的外边框大小
  227. /// </summary>
  228. public RectangleF GetSmallRect()
  229. {
  230. m_smallRect=this.GetSmallRectangleFromRect();
  231. return m_smallRect;
  232. }
  233. public bool IsSelect
  234. {
  235. get { return m_isSelected; }
  236. set { m_isSelected = value; }
  237. }
  238. /// <summary>
  239. /// 该颗粒是否被设置成,选中状态
  240. /// </summary>
  241. public PaintState GetPaintState()
  242. {
  243. if (GetDisplayState() == DisplayState.NODISPLAY)
  244. {
  245. m_paintState = PaintState.NOPAINT;
  246. }
  247. return m_paintState;
  248. }
  249. /// <summary>
  250. /// 该颗粒是否被设置成,选中状态
  251. /// </summary>
  252. public void SetPaintState(PaintState value)
  253. {
  254. if (value == PaintState.PAINT)
  255. {
  256. if (m_CurrentZoomNum >= m_zoom_displayThreshold)
  257. {
  258. m_paintState = PaintState.PAINT;
  259. }
  260. else
  261. {
  262. m_paintState = PaintState.CONCISEPAINT;
  263. }
  264. }
  265. else
  266. {
  267. m_paintState = value;
  268. }
  269. }
  270. /// <summary>
  271. /// 是否对该颗粒选定显示X-Ray能谱图
  272. /// </summary>
  273. public ParticleShowXray Operator_ShowXRay
  274. {
  275. get { return m_operator_showxray; }
  276. set { m_operator_showxray = value; }
  277. }
  278. /// <summary>
  279. /// 是否显示x号
  280. /// </summary>
  281. public bool IsShowSmallX
  282. {
  283. get { return m_showSmallx; }
  284. set { m_showSmallx = value; }
  285. }
  286. /// <summary>
  287. /// 颗粒的x-ray的点,是否被选择上了
  288. /// </summary>
  289. public bool IsSelectedSmallRect
  290. {
  291. get { return m_isSelected_smallrect; }
  292. set { m_isSelected_smallrect = value; }
  293. }
  294. /// <summary>
  295. /// 是否在被拖动
  296. /// </summary>
  297. public bool IsDragging
  298. {
  299. get { return m_isdragging; }
  300. set { m_isdragging = value; }
  301. }
  302. /// <summary>
  303. /// 被拖动到的位置坐标
  304. /// </summary>
  305. public PointF DraggingPoint
  306. {
  307. get { return m_dragingpoint; }
  308. set {
  309. m_dragingpoint = value;
  310. }
  311. }
  312. /// <summary>
  313. /// 线的颜色
  314. /// </summary>
  315. public Color Color
  316. {
  317. get { return m_color; }
  318. set { m_color = value; }
  319. }
  320. /// <summary>
  321. /// 多边形的图形路径边缘
  322. /// </summary>
  323. public GraphicsPath GetGPath()
  324. {
  325. m_gpath = this.GetRegionFromDSegments();
  326. return m_gpath;
  327. }
  328. /// <summary>
  329. /// 里面包含的多个线的集合
  330. /// </summary>
  331. public List<DisplaySegment> GetDSegments()
  332. { return m_listdsegment; }
  333. public void Zoom(float zoomDelta,PointF refPoint)
  334. {
  335. var segs = this.GetDSegments();
  336. for (int y = 0; y < segs.Count(); y++)
  337. {
  338. DisplaySegment ds = segs[y];
  339. var rec = ds.GetShowRect();
  340. rec.Width = (float)(rec.Width + Convert.ToDouble(rec.Width/m_CurrentZoomNum * zoomDelta));
  341. rec.Height = (float)(rec.Height + Convert.ToDouble(rec.Height/m_CurrentZoomNum * zoomDelta));
  342. //锚点缩放补差值计算,得出差值
  343. float xShiftOld = rec.X - refPoint.X;
  344. float yShiftOld = rec.Y - refPoint.Y;
  345. float xShift = rec.X - refPoint.X + xShiftOld/m_CurrentZoomNum * zoomDelta;
  346. float yShift = rec.Y - refPoint.Y + yShiftOld/m_CurrentZoomNum * zoomDelta;
  347. //对背景矩形与所有的segment进行修补差值
  348. rec.X = refPoint.X + xShift;
  349. rec.Y = refPoint.Y + yShift;
  350. ds.SetShowRect(rec);
  351. }
  352. m_rect=GetRectFromDSegment();
  353. //重新计算小矩形边框
  354. m_smallRect=GetSmallRectangleFromRect();
  355. //设置缩放到多少倍时进行显示
  356. if (m_CurrentZoomNum >= m_zoom_displayThreshold)
  357. {
  358. m_paintState = PaintState.PAINT;
  359. }
  360. else
  361. {
  362. m_paintState = PaintState.CONCISEPAINT;
  363. }
  364. m_CurrentZoomNum += zoomDelta;
  365. }
  366. public void DraggingMove(PointF mousePoint)
  367. {
  368. foreach (DisplaySegment ds in this.GetDSegments())
  369. {
  370. var rec = ds.GetShowRect();
  371. rec.X = ds.GetShowRect().X + mousePoint.X - this.DraggingPoint.X; //获取到原先点与移动点的增减量,+原先的x坐标,就是新的坐标
  372. rec.Y = ds.GetShowRect().Y + mousePoint.Y - this.DraggingPoint.Y;
  373. ds.SetShowRect(rec);
  374. }
  375. this.DraggingPoint = mousePoint;
  376. //获取矩形的rectangle
  377. m_rect = GetRectFromDSegment();
  378. ////重新计算小矩形边框
  379. m_smallRect = GetSmallRectangleFromRect();
  380. }
  381. public void Move(SizeF xyShift)
  382. {
  383. foreach (DisplaySegment ds in this.GetDSegments())
  384. {
  385. var rec = ds.GetShowRect();
  386. rec.X = ds.GetShowRect().X -xyShift.Width; //获取到原先点与移动点的增减量,+原先的x坐标,就是新的坐标
  387. rec.Y = ds.GetShowRect().Y - xyShift.Height ;
  388. ds.SetShowRect(rec);
  389. }
  390. //获取矩形的rectangle
  391. m_rect = GetRectFromDSegment();
  392. //重新计算小矩形边框
  393. m_smallRect = GetSmallRectangleFromRect();
  394. }
  395. /// <summary>
  396. /// 设置排序的类型
  397. /// </summary>
  398. public string SortType
  399. {
  400. get { return m_sort_type; }
  401. set { m_sort_type = value; }
  402. }
  403. /// <summary>
  404. /// 设置该多边形的尺寸大小
  405. /// </summary>
  406. public float FSize
  407. {
  408. get { return m_f_size; }
  409. set { m_f_size = value; }
  410. }
  411. /// <summary>
  412. /// 设置粒级
  413. /// </summary>
  414. public string ParticleLJ
  415. {
  416. get { return m_str_lj; }
  417. set { m_str_lj = value; }
  418. }
  419. /// <summary>
  420. /// 设置种类
  421. /// </summary>
  422. public string ParticleZL
  423. {
  424. get { return m_str_klzl; }
  425. set { m_str_klzl = value; }
  426. }
  427. /// <summary>
  428. /// 设置分类
  429. /// </summary>
  430. public string ParticleFL
  431. {
  432. get { return m_str_klfl; }
  433. set { m_str_klfl = value; }
  434. }
  435. /// <summary>
  436. /// 获取或设置该Particle对应底层的FieldID值
  437. /// </summary>
  438. public int FieldId
  439. {
  440. get { return objParticleData.FieldId; }
  441. }
  442. /// <summary>
  443. /// 获取或设置该Particle对应底层的ParticleID值
  444. /// </summary>
  445. public int ParticleId
  446. {
  447. get { return objParticleData.ParticleId; }
  448. }
  449. public bool IsDeleted { get => m_isDeleted; set => m_isDeleted = value; }
  450. public bool IsMouseOver { get => m_isMouseOver; set => m_isMouseOver = value; }
  451. public Image GetImage()
  452. {
  453. return m_image;
  454. }
  455. public void SetImage(Image value)
  456. {
  457. m_image = value;
  458. }
  459. public DisplayState GetDisplayState()
  460. {
  461. if (m_isDeleted)
  462. {
  463. m_displayState = DisplayState.NODISPLAY;
  464. }
  465. return m_displayState;
  466. }
  467. public void SetDisplayState(DisplayState value)
  468. {
  469. m_displayState = value;
  470. if (m_displayState == DisplayState.DISPLAY)
  471. {
  472. m_paintState = PaintState.PAINT;
  473. }
  474. }
  475. /// <summary>
  476. /// 绘制函数
  477. /// </summary>
  478. /// <param name="e"></param>
  479. public void OnPaint(PaintEventArgs e)
  480. {
  481. Graphics g = e.Graphics;
  482. //绘制鼠标移动到颗粒上时的边框,需要判断当前鼠标在颗粒上,及颗粒的操作为正常显示
  483. if (m_isMouseOver == true)
  484. {
  485. //如果有鼠标在该矩形上,那么进行描边
  486. ControlPaint.DrawBorder(g,
  487. Rectangle.Round(this.GetShowRect()),
  488. Color.Lime,
  489. 1,
  490. ButtonBorderStyle.Solid,
  491. Color.Lime,
  492. 1,
  493. ButtonBorderStyle.Solid,
  494. Color.Lime,
  495. 1,
  496. ButtonBorderStyle.Solid,
  497. Color.Lime,
  498. 1,
  499. ButtonBorderStyle.Solid);
  500. }
  501. if (GetPaintState() == PaintState.PAINT)
  502. {
  503. if (m_listdsegment.Count > 0)
  504. {
  505. if (this.ShowMode == SegmentShowMode.DRAWPARTICLEIMAGE)
  506. {
  507. e.Graphics.DrawImage(m_image, m_rect);
  508. }
  509. else
  510. {
  511. //调用绘制基本线
  512. foreach (DisplaySegment item in m_listdsegment)
  513. {
  514. item.OnPaint(e);
  515. }
  516. }
  517. }
  518. }
  519. if (GetPaintState() == PaintState.CONCISEPAINT)
  520. {
  521. g.DrawString("+", new Font("黑体", 6), new SolidBrush(Color.DarkSlateBlue), new PointF(m_smallRect.X, m_smallRect.Y));
  522. }
  523. if (m_isSelected)
  524. {
  525. //如果説该矩形被选择上了的话,那么也显示边框
  526. ControlPaint.DrawBorder(g,
  527. Rectangle.Round(this.GetShowRect()),
  528. Color.Blue,
  529. 1,
  530. ButtonBorderStyle.Solid,
  531. Color.Blue,
  532. 1,
  533. ButtonBorderStyle.Solid,
  534. Color.Blue,
  535. 1,
  536. ButtonBorderStyle.Solid,
  537. Color.Blue,
  538. 1,
  539. ButtonBorderStyle.Solid);
  540. }
  541. if (ParticleShowXray.DISPLAYXRAY == m_operator_showxray && PaintState.NOPAINT != GetPaintState())
  542. {
  543. //当鼠标在该颗粒上进行点击,则对颗粒状态更改为选定状态,用来显示X-ray能谱表
  544. ControlPaint.DrawBorder(g,
  545. Rectangle.Round(this.GetShowRect()),
  546. Color.DeepSkyBlue,
  547. 1,
  548. ButtonBorderStyle.Solid,
  549. Color.DeepSkyBlue,
  550. 1,
  551. ButtonBorderStyle.Solid,
  552. Color.DeepSkyBlue,
  553. 1,
  554. ButtonBorderStyle.Solid,
  555. Color.DeepSkyBlue,
  556. 1,
  557. ButtonBorderStyle.Solid);
  558. }
  559. }
  560. /// <summary>
  561. /// 从Line中获取矩形的边缘闭合路径
  562. /// </summary>
  563. /// <returns></returns>
  564. private GraphicsPath GetRegionFromDSegments()
  565. {
  566. GraphicsPath gpath = new GraphicsPath();
  567. List<PointF> list_leftpointf = new List<PointF>();
  568. List<PointF> list_rightpointf = new List<PointF>();
  569. //从y循环,这里假设y轴会按lines集合来计算,然后将所有的左x,和右x取出排成两个队列
  570. foreach (DisplaySegment ds in this.m_listdsegment)
  571. {
  572. list_leftpointf.Add(new PointF(ds.GetShowRect().X, ds.GetShowRect().Y));
  573. list_rightpointf.Add(new PointF(ds.GetShowRect().X + ds.GetShowRect().Width, ds.GetShowRect().Y));
  574. }
  575. PointF[] lsp = new PointF[list_leftpointf.Count + list_rightpointf.Count];
  576. //再将两个x,y点依次添加到闭合路径中
  577. for (int i = 0; i < list_leftpointf.Count(); i++)
  578. {
  579. lsp[i] = list_leftpointf[i];
  580. }
  581. //右节点
  582. for (int i = 0; i < list_rightpointf.Count(); i++)
  583. {
  584. //这边倒着存入
  585. lsp[list_rightpointf.Count() + i] = list_rightpointf[list_rightpointf.Count() - i - 1];
  586. }
  587. //防止从低层拿到无数据的外边路径,在我的程序里却需要计算,而防止程序报死,这里做一下特殊处理。
  588. if (lsp.Count() >= 3)
  589. {
  590. gpath.AddPolygon(lsp);
  591. }
  592. else
  593. {
  594. //有时居然有颗粒,有没有segment的时候,防止报错
  595. if (this.GetDSegments().Count == 0)
  596. {
  597. lsp = new PointF[3] { new PointF(0, 0), new PointF(0, 0), new PointF(0, 0) };
  598. gpath.AddPolygon(lsp);
  599. return gpath;
  600. }
  601. //有2条数据
  602. if (lsp[1].X != 0 && lsp[1].Y != 0)
  603. {
  604. lsp = new PointF[3] { new PointF(lsp[0].X, lsp[0].Y), new PointF(lsp[1].X, lsp[1].Y), new PointF(lsp[1].X, lsp[1].Y) };
  605. }
  606. //有1条数据
  607. else if (lsp[0].X != 0 && lsp[0].Y != 0)
  608. {
  609. lsp = new PointF[3] { new PointF(lsp[0].X, lsp[0].Y), new PointF(lsp[0].X, lsp[0].Y), new PointF(lsp[0].X, lsp[0].Y) };
  610. }
  611. //剩下的情况
  612. else
  613. {
  614. lsp = new PointF[3] { new PointF(0, 0), new PointF(0, 0), new PointF(0,0) };
  615. }
  616. gpath.AddPolygon(lsp);
  617. }
  618. return gpath;
  619. }
  620. /// <summary>
  621. /// 从已经确定的外边框来计算出里面的+号小框位置
  622. /// </summary>
  623. /// <returns></returns>
  624. private RectangleF GetSmallRectangleFromRect()
  625. {
  626. RectangleF rect = new RectangleF();
  627. //用外边框的坐标,除2获得中心点,然后再分别+,- 4
  628. float x = 0, y = 0;
  629. x = m_rect.X + (m_rect.Width / 2);
  630. y = m_rect.Y + (m_rect.Height / 2);
  631. rect.X = x - 4;
  632. rect.Y = y - 4;
  633. rect.Width = 8;
  634. rect.Height = 4;
  635. return rect;
  636. }
  637. /// <summary>
  638. /// 根据该多边形所有包含的线长度,计算出,该多边形的面积大小
  639. /// </summary>
  640. /// <returns></returns>
  641. public float GetAreaFormSegments()
  642. {
  643. float f_size_sum = 0;
  644. foreach (DisplaySegment ls_ds in this.m_listdsegment)
  645. {
  646. f_size_sum = f_size_sum + ls_ds.GetShowRect().Width;
  647. }
  648. return f_size_sum;
  649. }
  650. /// <summary>
  651. /// 从基本线中获取整个矩形的Rectangle
  652. /// </summary>
  653. /// <returns></returns>
  654. private RectangleF GetRectFromDSegment()
  655. {
  656. RectangleF rect = new RectangleF();
  657. float x1 = 0, y1 = 0;
  658. float i_width = 0, i_height = 0;
  659. //先从自身中初始化x,y,和宽,高
  660. if (this.m_listdsegment.Count > 0)
  661. {
  662. x1 = this.m_listdsegment[0].GetShowRect().X;
  663. y1 = this.m_listdsegment[0].GetShowRect().Y;
  664. i_width = x1 + this.m_listdsegment[0].GetShowRect().Width;
  665. i_height = this.m_listdsegment[0].GetShowRect().Y;
  666. }
  667. foreach (DisplaySegment ds in this.m_listdsegment)
  668. {
  669. //分别取出,最小的x,y,
  670. if (ds.GetShowRect().X < x1)
  671. {
  672. x1 = ds.GetShowRect().X;
  673. }
  674. if (ds.GetShowRect().Y < y1)
  675. {
  676. y1 = ds.GetShowRect().Y;
  677. }
  678. //最大的x,y
  679. if (ds.GetShowRect().X + ds.GetShowRect().Width > i_width)
  680. {
  681. i_width = ds.GetShowRect().X + ds.GetShowRect().Width;
  682. }
  683. if (ds.GetShowRect().Y > i_height)
  684. {
  685. i_height = ds.GetShowRect().Y;
  686. }
  687. }
  688. rect.X = x1 ;
  689. rect.Y = y1 ;
  690. rect.Width = i_width - rect.X ;
  691. rect.Height = i_height - rect.Y ;
  692. if (rect.Width < 1) rect.Width = 1;
  693. if (rect.Height < 1) rect.Height = 1;
  694. return rect;
  695. }
  696. public Color GetColorBySTDTypeIDForBSEAndSorImage(string in_partcolor, int in_stdtypeid)
  697. {
  698. Color ret_c = new Color();
  699. if (in_stdtypeid < 1000)
  700. {
  701. ret_c = GetColorByEnum(in_stdtypeid);
  702. }
  703. else if (in_stdtypeid >= 1000)
  704. {
  705. //大于等于1000,并且小于10000时,使用用户标准库来分析夹杂物名称
  706. if (!in_partcolor.Contains("#"))
  707. {
  708. ret_c = DrawFunction.colorHx16toRGB("#" + in_partcolor);//接收必须是#000000的格式
  709. }
  710. else
  711. {
  712. ret_c = DrawFunction.colorHx16toRGB(in_partcolor);//接收必须是#000000的格式
  713. }
  714. }
  715. return ret_c;
  716. }
  717. public Color GetColorByEnum(int STDID)
  718. {
  719. Color ret_c = new Color();
  720. switch (STDID)
  721. {
  722. case -1:
  723. //INVALID = -1,
  724. //stdName = "无效颗粒";
  725. ret_c = Color.Black;
  726. break;
  727. case 0:
  728. //small = 0;
  729. //stdName = "过小颗粒";
  730. ret_c = Color.Black;
  731. break;
  732. case 1:
  733. //OVERSIZE = 1,
  734. //stdName = "过大颗粒";
  735. ret_c = Color.Black;
  736. break;
  737. case 2:
  738. //AVE_GRAY_NOT_INRANRE = 2,
  739. //stdName = "亮度不在分析范围内的颗粒";
  740. ret_c = Color.Black;
  741. break;
  742. case 3:
  743. //SEARCH_X_RAY = 3,
  744. //stdName = "不进行搜索x-ray分析的颗粒";
  745. ret_c = Color.Black;
  746. break;
  747. case 4:
  748. //LOW_COUNT = 4,
  749. //stdName = "低x-ray计数颗粒";
  750. ret_c = Color.Black;
  751. break;
  752. case 5:
  753. //NO_INTEREST_ELEMENTS = 5,
  754. //stdName = "不含分析元素的颗粒";
  755. ret_c = Color.Black;
  756. break;
  757. case 6:
  758. //ALAYSIS_X_RAY = 6,
  759. //stdName = "不进行x-ray分析的颗粒";
  760. ret_c = Color.Black;
  761. break;
  762. case 7:
  763. //NOT_IDENTIFIED = 7,
  764. //stdName = "未识别颗粒";
  765. ret_c = Color.Black;
  766. break;
  767. case 8:
  768. //NOT_IDENTIFIED = 8,
  769. //stdName = "未识别颗粒";
  770. ret_c = Color.Black;
  771. break;
  772. case 9:
  773. //NOT_IDENTIFIED = 9,
  774. //stdName = "未识别颗粒";
  775. ret_c = Color.Black;
  776. break;
  777. default:
  778. ret_c = Color.Black;
  779. break;
  780. }
  781. return ret_c;
  782. }
  783. }
  784. }