GasFunnel.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using netDxf;
  2. using netDxf.Entities;
  3. using System;
  4. using System.Collections.Generic;
  5. namespace MECF.Framework.UI.Core.DxfScript
  6. {
  7. public class GasFunnel : GasBaseShape
  8. {
  9. public GasFunnel(double x, double y, double z, double scaleX, double scaleY, double scaleZ, double rotation)
  10. {
  11. X = x;
  12. Y = y;
  13. Z = z;
  14. ScaleX = scaleX;
  15. ScaleY = scaleY;
  16. ScaleZ = scaleZ;
  17. Rotation = rotation;
  18. Id = CreateId(ShapeType.FUNNEL, x, y);
  19. }
  20. /// <summary>
  21. /// 坐标X
  22. /// </summary>
  23. public double X { get; set; }
  24. /// <summary>
  25. /// 坐标Y
  26. /// </summary>
  27. public double Y { get; set; }
  28. /// <summary>
  29. /// 坐标Z
  30. /// </summary>
  31. public double Z { get; set; }
  32. /// <summary>
  33. /// X轴的缩放因子
  34. /// </summary>
  35. public double ScaleX { get; set; }
  36. /// <summary>
  37. /// Y轴的缩放因子
  38. /// </summary>
  39. public double ScaleY { get; set; }
  40. /// <summary>
  41. /// Z轴的缩放因子
  42. /// </summary>
  43. public double ScaleZ { get; set; }
  44. /// <summary>
  45. /// 旋转角度
  46. /// </summary>
  47. public double Rotation { get; set; }
  48. /// <summary>
  49. /// 多条线
  50. /// </summary>
  51. public List<GasLine> GasLines { get; set; } = new List<GasLine>();
  52. /// <summary>
  53. /// 圆
  54. /// </summary>
  55. public List<GasCircle> GasCircles { get; set; } = new List<GasCircle>();
  56. public override bool Contains(double x, double y)
  57. {
  58. //是否点击到了线
  59. foreach (GasLine line in GasLines)
  60. {
  61. if (line.Contains(x, y)) return true;
  62. }
  63. //是否点击到了线内空间 后期优化
  64. return false;
  65. }
  66. public override void Move(double x, double y)
  67. {
  68. X = X + x; Y = Y + y;
  69. foreach (GasLine line in GasLines)
  70. {
  71. line.Move(x, y);
  72. }
  73. }
  74. /// <summary>
  75. /// 处理漏斗中的线
  76. /// </summary>
  77. /// <param name="insert"></param>
  78. public void SetGasLines(Insert insert)
  79. {
  80. var block = insert.Block;
  81. foreach (EntityObject blockEntity in block.Entities)
  82. {
  83. //处理块中包含的类型
  84. if (blockEntity.Type == EntityType.Line)
  85. {
  86. Line line = (Line)blockEntity;
  87. var start = TransformPoint(line.StartPoint, insert);
  88. var end = TransformPoint(line.EndPoint, insert);
  89. GasLines.Add(new GasLine(start.X, start.Y, end.X, end.Y));
  90. }
  91. }
  92. }
  93. // 计算实际坐标,考虑插入点、比例和旋转
  94. private static Vector3 TransformPoint(Vector3 point, Insert insert)
  95. {
  96. // 应用比例变换
  97. double x = point.X * insert.Scale.X;
  98. double y = point.Y * insert.Scale.Y;
  99. double z = point.Z * insert.Scale.Z;
  100. // 应用旋转变换
  101. double angle = insert.Rotation * Math.PI / 180.0; // 将角度转换为弧度
  102. double cosAngle = Math.Cos(angle);
  103. double sinAngle = Math.Sin(angle);
  104. double rotatedX = x * cosAngle - y * sinAngle;
  105. double rotatedY = x * sinAngle + y * cosAngle;
  106. // 应用插入点偏移
  107. double finalX = insert.Position.X + rotatedX;
  108. double finalY = insert.Position.Y + rotatedY;
  109. double finalZ = insert.Position.Z + z;
  110. return new Vector3(finalX, finalY, finalZ);
  111. }
  112. }
  113. }