using netDxf; using netDxf.Entities; using System; using System.Collections.Generic; namespace MECF.Framework.UI.Core.DxfScript { public class GasFunnel : GasBaseShape { public GasFunnel(double x, double y, double z, double scaleX, double scaleY, double scaleZ, double rotation) { X = x; Y = y; Z = z; ScaleX = scaleX; ScaleY = scaleY; ScaleZ = scaleZ; Rotation = rotation; Id = CreateId(ShapeType.FUNNEL, x, y); } /// /// 坐标X /// public double X { get; set; } /// /// 坐标Y /// public double Y { get; set; } /// /// 坐标Z /// public double Z { get; set; } /// /// X轴的缩放因子 /// public double ScaleX { get; set; } /// /// Y轴的缩放因子 /// public double ScaleY { get; set; } /// /// Z轴的缩放因子 /// public double ScaleZ { get; set; } /// /// 旋转角度 /// public double Rotation { get; set; } /// /// 多条线 /// public List GasLines { get; set; } = new List(); /// /// 圆 /// public List GasCircles { get; set; } = new List(); public override bool Contains(double x, double y) { //是否点击到了线 foreach (GasLine line in GasLines) { if (line.Contains(x, y)) return true; } //是否点击到了线内空间 后期优化 return false; } public override void Move(double x, double y) { X = X + x; Y = Y + y; foreach (GasLine line in GasLines) { line.Move(x, y); } } /// /// 处理漏斗中的线 /// /// public void SetGasLines(Insert insert) { var block = insert.Block; foreach (EntityObject blockEntity in block.Entities) { //处理块中包含的类型 if (blockEntity.Type == EntityType.Line) { Line line = (Line)blockEntity; var start = TransformPoint(line.StartPoint, insert); var end = TransformPoint(line.EndPoint, insert); GasLines.Add(new GasLine(start.X, start.Y, end.X, end.Y)); } } } // 计算实际坐标,考虑插入点、比例和旋转 private static Vector3 TransformPoint(Vector3 point, Insert insert) { // 应用比例变换 double x = point.X * insert.Scale.X; double y = point.Y * insert.Scale.Y; double z = point.Z * insert.Scale.Z; // 应用旋转变换 double angle = insert.Rotation * Math.PI / 180.0; // 将角度转换为弧度 double cosAngle = Math.Cos(angle); double sinAngle = Math.Sin(angle); double rotatedX = x * cosAngle - y * sinAngle; double rotatedY = x * sinAngle + y * cosAngle; // 应用插入点偏移 double finalX = insert.Position.X + rotatedX; double finalY = insert.Position.Y + rotatedY; double finalZ = insert.Position.Z + z; return new Vector3(finalX, finalY, finalZ); } } }