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);
}
}
}