DrawData.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using netDxf;
  2. using netDxf.Tables;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.Drawing.Drawing2D;
  7. using System.Linq;
  8. using System.Numerics;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Vector2 = System.Numerics.Vector2;
  12. using Vector3 = System.Numerics.Vector3;
  13. using Vector4 = System.Numerics.Vector4;
  14. namespace InABox.Dxf;
  15. internal class TransformData
  16. {
  17. public DxfData Data { get; set; }
  18. private Stack<Matrix4x4> MatrixStack = new();
  19. public Matrix4x4 Transform { get; private set; } = Matrix4x4.Identity;
  20. public void PushTransform()
  21. {
  22. MatrixStack.Push(Transform);
  23. }
  24. protected virtual void UpdateTransform()
  25. {
  26. }
  27. protected Matrix ProjectMatrix(Matrix4x4 matrix)
  28. {
  29. var elMatrix = new Matrix3x2();
  30. elMatrix.M11 = (float)matrix.M11;
  31. elMatrix.M12 = (float)matrix.M12;
  32. elMatrix.M21 = (float)matrix.M21;
  33. elMatrix.M22 = (float)matrix.M22;
  34. elMatrix.M31 = (float)matrix.M41;
  35. elMatrix.M32 = (float)matrix.M42;
  36. var newMatrix = new Matrix();
  37. newMatrix.MatrixElements = elMatrix;
  38. return newMatrix;
  39. }
  40. public void PopTransform()
  41. {
  42. Transform = MatrixStack.Pop();
  43. UpdateTransform();
  44. }
  45. public static Matrix4x4 ArbitraryAxisMatrix(Vector3 zAxis)
  46. {
  47. if (zAxis.Equals(Vector3.UnitZ))
  48. {
  49. return Matrix4x4.Identity;
  50. }
  51. var unitY = Vector3.UnitY;
  52. var unitZ = Vector3.UnitZ;
  53. var v = ((!(Math.Abs(zAxis.X) < 1.0 / 64.0) || !(Math.Abs(zAxis.Y) < 1.0 / 64.0)) ? Vector3.Cross(unitZ, zAxis) : Vector3.Cross(unitY, zAxis));
  54. v = Vector3.Normalize(v);
  55. var vector = Vector3.Cross(zAxis, v);
  56. vector = Vector3.Normalize(vector);
  57. return new Matrix4x4(v.X, vector.X, zAxis.X, 0, v.Y, vector.Y, zAxis.Y, 0, v.Z, vector.Z, zAxis.Z, 0, 0, 0, 0, 1);
  58. }
  59. public void ArbitraryAxis(netDxf.Vector3 zAxis)
  60. {
  61. Transform = ArbitraryAxisMatrix(new((float)zAxis.X, (float)zAxis.Y, (float)zAxis.Z)) * Transform;
  62. UpdateTransform();
  63. }
  64. public void ArbitraryAxis(Vector3 zAxis)
  65. {
  66. Transform = ArbitraryAxisMatrix(zAxis) * Transform;
  67. UpdateTransform();
  68. }
  69. public void Translate(float x, float y)
  70. {
  71. Transform = Transform.Translate(x, y, 0);
  72. UpdateTransform();
  73. }
  74. public void Translate(PointF point)
  75. {
  76. Transform = Transform.Translate(point.X, point.Y, 0);
  77. UpdateTransform();
  78. }
  79. public void Rotate(float angle)
  80. {
  81. Transform = Transform.Rotate(0, 0, 1, angle);
  82. UpdateTransform();
  83. }
  84. public void Scale(float scale)
  85. {
  86. Scale(scale, scale);
  87. }
  88. public void Scale(float scaleX, float scaleY)
  89. {
  90. Transform = Transform.Scale(scaleX, scaleY, 1);
  91. UpdateTransform();
  92. }
  93. public float ConvertThickness(float thickness)
  94. {
  95. return thickness == 0 ? 1f / ScaleFactor() : thickness;
  96. }
  97. public PointF TransformPoint(float x, float y)
  98. {
  99. var nVec = Vector4.Transform(new Vector4(x, y, 0, 1), Transform);
  100. return new(nVec.X, nVec.Y);
  101. }
  102. public PointF TransformPoint(PointF vec)
  103. {
  104. var nVec = Vector4.Transform(new Vector4(vec.X, vec.Y, 0, 1), Transform);
  105. return new(nVec.X, nVec.Y);
  106. }
  107. public PointF TransformPoint(netDxf.Vector2 vec)
  108. {
  109. var nVec = Vector4.Transform(new Vector4((float)vec.X, (float)vec.Y, 0, 1), Transform);
  110. return new(nVec.X, nVec.Y);
  111. }
  112. public PointF TransformPoint(netDxf.Vector3 vec)
  113. {
  114. var nVec = Vector4.Transform(new Vector4((float)vec.X, (float)vec.Y, (float)vec.Z, 1), Transform);
  115. return new(nVec.X, nVec.Y);
  116. }
  117. public PointF TransformVec(PointF vec)
  118. {
  119. var nVec = Vector4.Transform(new Vector4(vec.X, vec.Y, 0, 0), Transform);
  120. return new(nVec.X, nVec.Y);
  121. }
  122. public Vector2 TransformVec(Vector2 vec)
  123. {
  124. var nVec = Vector4.Transform(new Vector4(vec.X, vec.Y, 0, 0), Transform);
  125. return new(nVec.X, nVec.Y);
  126. }
  127. public float ScaleFactor()
  128. {
  129. return (TransformVec(new Vector2(1, 0))).Length();
  130. }
  131. public static PointF ConvertPoint(netDxf.Vector2 vec)
  132. {
  133. return new PointF((float)vec.X, (float)vec.Y);
  134. }
  135. public static PointF ConvertPoint(netDxf.Vector3 vec)
  136. {
  137. return new PointF((float)vec.X, (float)vec.Y);
  138. }
  139. }
  140. internal class DrawData : TransformData
  141. {
  142. public Graphics Graphics { get; set; }
  143. protected override void UpdateTransform()
  144. {
  145. base.UpdateTransform();
  146. Graphics.Transform = ProjectMatrix(Transform);
  147. }
  148. }