lixiaojun
2025-04-12 0036161bed7249bed9cbf7cef71cc8a35378b08a
Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalEditManager.cs
@@ -1,4 +1,6 @@
namespace Yw.WpfUI.Hydro
using HelixToolkit.Wpf;
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// 抽象编辑管理器
@@ -154,6 +156,36 @@
                        }
                    }
                    break;
                case eLogicalEditMode.AddHorizPipe:
                    {
                        var pt = e.GetPosition(_viewport);
                        var logicalNode = SnapNearestNode(pt);
                        if (logicalNode != null)
                        {
                            var visual = new PipeL3d();
                            visual.Id = Yw.Untity.UniqueHelper.CreateFromFirst("pipe", _nw.Pipes.Select(x => x.Id).ToList());
                            visual.StartPosition = logicalNode.Position.ToPointL3d();
                            visual.EndPosition = logicalNode.Position.ToPointL3d();
                            AddVisual(visual);
                            _visual = visual;
                        }
                    }
                    break;
                case eLogicalEditMode.AddVertPipe:
                    {
                        var pt = e.GetPosition(_viewport);
                        var logicalNode = SnapNearestNode(pt);
                        if (logicalNode != null)
                        {
                            var visual = new PipeL3d();
                            visual.Id = Yw.Untity.UniqueHelper.CreateFromFirst("pipe", _nw.Pipes.Select(x => x.Id).ToList());
                            visual.StartPosition = logicalNode.Position.ToPointL3d();
                            visual.EndPosition = logicalNode.Position.ToPointL3d();
                            AddVisual(visual);
                            _visual = visual;
                        }
                    }
                    break;
                case eLogicalEditMode.AddPump:
                    {
                        var pt = e.GetPosition(_viewport);
@@ -203,16 +235,19 @@
            {
                case eLogicalEditMode.AddJunction:
                    {
                        _visual = null;
                        _logicalMode = eLogicalEditMode.None;
                    }
                    break;
                case eLogicalEditMode.AddReservoir:
                    {
                        _visual = null;
                        _logicalMode = eLogicalEditMode.None;
                    }
                    break;
                case eLogicalEditMode.AddTank:
                    {
                        _visual = null;
                        _logicalMode = eLogicalEditMode.None;
                    }
                    break;
@@ -238,16 +273,46 @@
                                UpdateVisual(pipe);
                            }
                        }
                        _visual = null;
                        _logicalMode = eLogicalEditMode.None;
                    }
                    break;
                case eLogicalEditMode.AddHorizPipe:
                    {
                        var pipe = _visual as PipeL3d;
                        if (pipe != null)
                        {
                            var end = pipe.EndPosition.ToPoint3D();
                            var logicalNode = SnapNearestNode(end);
                            if (logicalNode == null)
                            {
                                var junction = new JunctionL3d();
                                junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", _nw.Junctions.Select(x => x.Id).ToList());
                                junction.Position = end.ToPointL3d();
                                AddVisual(junction);
                            }
                        }
                        _visual = null;
                        _logicalMode = eLogicalEditMode.None;
                    }
                    break;
                case eLogicalEditMode.AddVertPipe:
                    {
                        var pipe = _visual as PipeL3d;
                        if (pipe != null)
                        {
                            var end = pipe.EndPosition.ToPoint3D();
                            LogicalNode3D logicalNode = SnapNearestNode(end);
                            if (logicalNode == null)
                            {
                                var junction = new JunctionL3d();
                                junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", _nw.Junctions.Select(x => x.Id).ToList());
                                junction.Position = end.ToPointL3d();
                                AddVisual(junction);
                            }
                        }
                        _visual = null;
                        _logicalMode = eLogicalEditMode.None;
                    }
                    break;
@@ -273,6 +338,7 @@
                                UpdateVisual(pump);
                            }
                        }
                        _visual = null;
                        _logicalMode = eLogicalEditMode.None;
                    }
                    break;
@@ -298,6 +364,7 @@
                                UpdateVisual(valve);
                            }
                        }
                        _visual = null;
                        _logicalMode = eLogicalEditMode.None;
                    }
                    break;
@@ -326,6 +393,7 @@
                    break;
                case eLogicalEditMode.AddPipe:
                    {
                        base.OnMouseMove(e);
                        var pipe = _visual as PipeL3d;
                        if (pipe != null)
                        {
@@ -339,8 +407,41 @@
                        }
                    }
                    break;
                case eLogicalEditMode.AddHorizPipe:
                    {
                        base.OnMouseMove(e);
                        var pipe = _visual as PipeL3d;
                        if (pipe != null)
                        {
                            var pt = e.GetPosition(_viewport);
                            var sp = _viewport.Viewport.UnProject(pt);
                            if (sp.HasValue)
                            {
                                pipe.EndPosition = new PointL3d(sp.Value.X, sp.Value.Y, pipe.StartPosition.Z);
                                UpdateVisual(_visual);
                            }
                        }
                    }
                    break;
                case eLogicalEditMode.AddVertPipe:
                    {
                        base.OnMouseMove(e);
                        var pipe = _visual as PipeL3d;
                        if (pipe != null)
                        {
                            var pt = e.GetPosition(_viewport);
                            var sp = _viewport.Viewport.UnProject(pt);
                            if (sp.HasValue)
                            {
                                pipe.EndPosition = new PointL3d(pipe.StartPosition.X, pipe.StartPosition.Y, sp.Value.Z);
                                UpdateVisual(_visual);
                            }
                        }
                    }
                    break;
                case eLogicalEditMode.AddPump:
                    {
                        base.OnMouseMove(e);
                        var pump = _visual as PumpL3d;
                        if (pump != null)
                        {
@@ -356,6 +457,7 @@
                    break;
                case eLogicalEditMode.AddValve:
                    {
                        base.OnMouseMove(e);
                        var valve = _visual as ValveL3d;
                        if (valve != null)
                        {
@@ -434,7 +536,20 @@
            return logicalNode;
        }
        //吸附最近节点
        private LogicalNode3D SnapNearestNode(Point3D pt)
        {
            if (!Initialized)
            {
                return default;
            }
            var snapDistance = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.SnapDistance;
            var logicalNode = _viewport.Children.OfType<LogicalNode3D>()
                .OrderBy(x => (x.Position - pt).LengthSquared)
                .FirstOrDefault(x => (x.Position - pt).Length < snapDistance);
            return logicalNode;
        }
        #endregion