Objects.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using InABox.Core;
  2. using netDxf;
  3. using netDxf.Entities;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace InABox.Dxf;
  12. internal interface IDxfObject
  13. {
  14. void Draw(DrawData data);
  15. }
  16. internal class DxfLine : IDxfObject
  17. {
  18. public Line Line { get; set; }
  19. public void Draw(DrawData data)
  20. {
  21. if (!Line.IsVisible || !data.Data.HasLayer(Line.Layer)) return;
  22. data.Graphics.DrawLine(new Pen(Color.Black, data.ConvertThickness((float)Line.Thickness)), DrawData.ConvertPoint(Line.StartPoint), DrawData.ConvertPoint(Line.EndPoint));
  23. }
  24. }
  25. internal class DxfInsert : IDxfObject
  26. {
  27. public Insert Insert { get; set; }
  28. public List<IDxfObject> Objects { get; set; }
  29. public DxfInsert(Insert insert)
  30. {
  31. Insert = insert;
  32. Objects = insert.Block.Entities.Select(DxfUtils.ConvertEl).NotNull().ToList();
  33. }
  34. public void Draw(DrawData data)
  35. {
  36. if (!Insert.IsVisible) return;
  37. data.PushTransform();
  38. data.Translate(new PointF((float)Insert.Position.X, (float)Insert.Position.Y));
  39. data.Rotate((float)Insert.Rotation);
  40. data.Scale((float)Insert.Scale.X, (float)Insert.Scale.Y);
  41. foreach(var obj in Objects)
  42. {
  43. obj.Draw(data);
  44. }
  45. data.PopTransform();
  46. }
  47. }
  48. internal class DxfEllipse : IDxfObject
  49. {
  50. public Ellipse Ellipse { get; set; }
  51. public DxfEllipse(Ellipse ellipse)
  52. {
  53. Ellipse = ellipse;
  54. }
  55. public void Draw(DrawData data)
  56. {
  57. if (!Ellipse.IsVisible || !data.Data.HasLayer(Ellipse.Layer)) return;
  58. var center = DrawData.ConvertPoint(Ellipse.Center);
  59. var size = new SizeF((float)Ellipse.MajorAxis, (float)Ellipse.MinorAxis);
  60. var startAngle = (float)(Ellipse.StartAngle);
  61. var endAngle = (float)(Ellipse.EndAngle);
  62. data.Graphics.DrawArc(new Pen(Color.Black, data.ConvertThickness((float)Ellipse.Thickness)), center.X - size.Width / 2, center.Y - size.Height / 2, size.Width, size.Height, startAngle, Utils.Mod(endAngle - startAngle, 360));
  63. }
  64. }
  65. internal class DxfPolyline2D : IDxfObject
  66. {
  67. public Polyline2D Polyline { get; set; }
  68. public DxfPolyline2D(Polyline2D polyline)
  69. {
  70. Polyline = polyline;
  71. }
  72. public void Draw(DrawData data)
  73. {
  74. if (!Polyline.IsVisible || !data.Data.HasLayer(Polyline.Layer)) return;
  75. var entities = Polyline.Explode();
  76. foreach(var entity in entities)
  77. {
  78. DxfUtils.ConvertEl(entity)?.Draw(data);
  79. }
  80. // if(Polyline.SmoothType == PolylineSmoothType.NoSmooth)
  81. // {
  82. // var vertices = Polyline.Vertexes.ToArray(x => new PointF((float)x.Position.X, (float)x.Position.Y));
  83. // if (Polyline.IsClosed)
  84. // {
  85. // data.Graphics.DrawPolygon(
  86. // new Pen(Color.Black, data.ConvertThickness((float)Polyline.Thickness)),
  87. // vertices);
  88. // }
  89. // else
  90. // {
  91. // data.Graphics.DrawLines(
  92. // new Pen(Color.Black, data.ConvertThickness((float)Polyline.Thickness)),
  93. // vertices);
  94. // }
  95. // }
  96. // else
  97. // {
  98. // }
  99. }
  100. }
  101. internal class DxfMText : IDxfObject
  102. {
  103. public MText MText { get; set; }
  104. public DxfMText(MText text)
  105. {
  106. MText = text;
  107. }
  108. public void Draw(DrawData data)
  109. {
  110. if (!MText.IsVisible || !data.Data.HasLayer(MText.Layer)) return;
  111. Font font;
  112. if (MText.Style.FontFamilyName.IsNullOrWhiteSpace())
  113. {
  114. font = SystemFonts.DefaultFont;
  115. }
  116. else
  117. {
  118. var fontFamily = new FontFamily(MText.Style.FontFamilyName);
  119. font = new Font(fontFamily, (float)MText.Height, MText.Style.FontStyle switch
  120. {
  121. netDxf.Tables.FontStyle.Bold => FontStyle.Bold,
  122. netDxf.Tables.FontStyle.Italic => FontStyle.Italic,
  123. netDxf.Tables.FontStyle.Regular or _ => FontStyle.Regular,
  124. });
  125. }
  126. data.PushTransform();
  127. data.Translate(new PointF((float)MText.Position.X, (float)MText.Position.Y));
  128. data.Rotate((float)MText.Rotation);
  129. data.Scale(1, -1);
  130. var size = data.Graphics.MeasureString(MText.PlainText(), font, new PointF(), StringFormat.GenericTypographic);
  131. switch (MText.AttachmentPoint)
  132. {
  133. case MTextAttachmentPoint.MiddleLeft:
  134. case MTextAttachmentPoint.MiddleCenter:
  135. case MTextAttachmentPoint.MiddleRight:
  136. data.Translate(new PointF(0, -size.Height / 2));
  137. break;
  138. case MTextAttachmentPoint.BottomLeft:
  139. case MTextAttachmentPoint.BottomCenter:
  140. case MTextAttachmentPoint.BottomRight:
  141. data.Translate(new PointF(0, -size.Height));
  142. break;
  143. default:
  144. var ascent = font.FontFamily.GetCellAscent(font.Style);
  145. var lineSpace = font.FontFamily.GetLineSpacing(font.Style);
  146. var baseline = ascent * font.Height / font.FontFamily.GetEmHeight(font.Style);
  147. var ratio = font.GetHeight(data.Graphics) / lineSpace;
  148. data.Translate(new PointF(0, -baseline + ascent * ratio));
  149. break;
  150. }
  151. switch (MText.AttachmentPoint)
  152. {
  153. case MTextAttachmentPoint.TopLeft:
  154. case MTextAttachmentPoint.MiddleLeft:
  155. case MTextAttachmentPoint.BottomLeft:
  156. break;
  157. case MTextAttachmentPoint.TopCenter:
  158. case MTextAttachmentPoint.MiddleCenter:
  159. case MTextAttachmentPoint.BottomCenter:
  160. data.Translate(new PointF(-(float)size.Width / 2, 0));
  161. break;
  162. case MTextAttachmentPoint.TopRight:
  163. case MTextAttachmentPoint.MiddleRight:
  164. case MTextAttachmentPoint.BottomRight:
  165. data.Translate(new PointF(-(float)size.Width, 0));
  166. break;
  167. }
  168. data.Graphics.DrawString(MText.PlainText(), font, new SolidBrush(Color.Black), new PointF(0, 0), StringFormat.GenericTypographic);
  169. data.PopTransform();
  170. }
  171. }
  172. internal class DxfDimension : IDxfObject
  173. {
  174. public Dimension Dimension { get; set; }
  175. public DxfDimension(Dimension dimension)
  176. {
  177. Dimension = dimension;
  178. }
  179. public void Draw(DrawData data)
  180. {
  181. if (!Dimension.IsVisible || !data.Data.HasLayer(Dimension.Layer)) return;
  182. var entities = Dimension.Block.Entities;
  183. foreach(var entity in entities)
  184. {
  185. DxfUtils.ConvertEl(entity)?.Draw(data);
  186. }
  187. }
  188. }