lixiaojun
2025-04-12 0036161bed7249bed9cbf7cef71cc8a35378b08a
增加水平管和垂直管添加
已删除3个文件
已修改8个文件
450 ■■■■■ 文件已修改
Yw.WpfUI.Hydro.L3d.Core/01-network/02-visual/VisualL3d.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/01-network/03-node/00-core/NodeL3d.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/01-network/04-link/00-core/LinkL3d.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/01-network/05-style/SimpleLinkL3dStyle.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/01-network/05-style/SimpleNodeL3dStyle.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/01-network/05-style/SimpleVisualL3dStyle.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalEditManager.cs 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml.cs 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Test.Core/MainWindow.xaml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Test.Core/MainWindow.xaml.cs 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/01-network/02-visual/VisualL3d.cs
@@ -16,16 +16,6 @@
        public VisualL3d(VisualL3d rhs) : base(rhs) { }
        /// <summary>
        /// ç®€å•样式
        /// </summary>
        public SimpleVisualL3dStyle SimpleStyle
        {
            get { return _simpleStyle; }
            set { _simpleStyle = value; }
        }
        protected SimpleVisualL3dStyle _simpleStyle;
        /// <summary>
        /// èŽ·å–ä½ç½®
        /// </summary>
        public abstract List<PointL3d> GetPositions();
Yw.WpfUI.Hydro.L3d.Core/01-network/03-node/00-core/NodeL3d.cs
@@ -10,7 +10,7 @@
        /// </summary>
        public NodeL3d()
        {
            this.SimpleStyle = new SimpleNodeL3dStyle("#E94242", 0.5d);
        }
        /// <summary>
@@ -25,16 +25,6 @@
        /// ä½ç½®
        /// </summary>
        public PointL3d Position { get; set; }
        /// <summary>
        /// ç®€å•样式
        /// </summary>
        public new SimpleNodeL3dStyle SimpleStyle
        {
            get { return _simpleStyle as SimpleNodeL3dStyle; }
            set { _simpleStyle = value; }
        }
        /// <summary>
Yw.WpfUI.Hydro.L3d.Core/01-network/04-link/00-core/LinkL3d.cs
@@ -10,7 +10,7 @@
        /// </summary>
        public LinkL3d()
        {
            this.SimpleStyle = new SimpleLinkL3dStyle("#0000FF", 0.5d);
        }
        /// <summary>
@@ -31,15 +31,6 @@
        /// ä¸‹æ¸¸ä½ç½®
        /// </summary>
        public PointL3d EndPosition { get; set; }
        /// <summary>
        /// ç®€å•样式
        /// </summary>
        public new SimpleLinkL3dStyle SimpleStyle
        {
            get { return _simpleStyle as SimpleLinkL3dStyle; }
            set { _simpleStyle = value; }
        }
        /// <summary>
        /// èŽ·å–ä½ç½®
Yw.WpfUI.Hydro.L3d.Core/01-network/05-style/SimpleLinkL3dStyle.cs
ÎļþÒÑɾ³ý
Yw.WpfUI.Hydro.L3d.Core/01-network/05-style/SimpleNodeL3dStyle.cs
ÎļþÒÑɾ³ý
Yw.WpfUI.Hydro.L3d.Core/01-network/05-style/SimpleVisualL3dStyle.cs
ÎļþÒÑɾ³ý
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
Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs
@@ -1,7 +1,4 @@
using System.Windows.Controls;
using System.Windows.Media.Media3D;
namespace Yw.WpfUI.Hydro
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡ç®¡ç†å™¨
@@ -425,7 +422,94 @@
        #endregion
        #region è§†è§’
        /// <summary>
        /// è®¾ç½®ä¸Šè§†å›¾
        /// </summary>
        public virtual void SetTopView()
        {
            if (!Initialized)
            {
                return;
            }
            var lookDirection = new Vector3D(0, 0, -1); // å‘下看
            var upDirection = new Vector3D(0, 1, 0);// Y轴朝上
            _viewport.FitView(lookDirection, upDirection);
        }
        /// <summary>
        /// è®¾ç½®ä¸‹è§†å›¾
        /// </summary>
        public virtual void SetBottomView()
        {
            if (!Initialized)
            {
                return;
            }
            var lookDirection = new Vector3D(0, 0, 1);   // å‘上看
            var upDirection = new Vector3D(0, 1, 0);// Y轴朝上
            _viewport.FitView(lookDirection, upDirection);
        }
        /// <summary>
        /// è®¾ç½®å·¦è§†å›¾
        /// </summary>
        public virtual void SetLeftView()
        {
            if (!Initialized)
            {
                return;
            }
            var lookDirection = new Vector3D(1, 0, 0);   // å‘右看
            var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
            _viewport.FitView(lookDirection, upDirection);
        }
        /// <summary>
        /// è®¾ç½®å³è§†å›¾
        /// </summary>
        public virtual void SetRightView()
        {
            if (!Initialized)
            {
                return;
            }
            var lookDirection = new Vector3D(-1, 0, 0);   // å‘左看
            var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
            _viewport.FitView(lookDirection, upDirection);
        }
        /// <summary>
        /// è®¾ç½®å‰è§†å›¾
        /// </summary>
        public virtual void SetFrontView()
        {
            if (!Initialized)
            {
                return;
            }
            var lookDirection = new Vector3D(0, 1, 0);   // å‘后看
            var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
            _viewport.FitView(lookDirection, upDirection);
        }
        /// <summary>
        /// è®¾ç½®åŽè§†å›¾
        /// </summary>
        public virtual void SetBackView()
        {
            if (!Initialized)
            {
                return;
            }
            var lookDirection = new Vector3D(0, -1, 0);   // å‘前看
            var upDirection = new Vector3D(0, 0, 1);// Z轴朝上
            _viewport.FitView(lookDirection, upDirection);
        }
        #endregion
Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml.cs
@@ -71,6 +71,17 @@
            _manager.StartAddPipe();
        }
        public void StartAddHorizPipe()
        {
            _manager.StartAddHorizPipe();
        }
        public void StartAddVertPipe()
        {
            _manager.StartAddVertPipe();
        }
        public void StartAddPump()
        {
            _manager.StartAddPump();
@@ -81,5 +92,40 @@
            _manager.StartAddValve();
        }
        #region è§†è§’
        public void SetTopView()
        {
            _manager.SetTopView();
        }
        public void SetBottomView()
        {
            _manager.SetBottomView();
        }
        public void SetLeftView()
        {
            _manager.SetLeftView();
        }
        public void SetRightView()
        {
            _manager.SetRightView();
        }
        public void SetFrontView()
        {
            _manager.SetFrontView();
        }
        public void SetBackView()
        {
            _manager.SetBackView();
        }
        #endregion
    }
}
Yw.WpfUI.Test.Core/MainWindow.xaml
@@ -41,6 +41,7 @@
                Content="➕ æ°´æ± "
                GroupName="Add"
                ToolTip="添加水池 (T)" />
            <Separator />
            <RadioButton
                x:Name="rbAddPipe"
                Margin="5"
@@ -62,6 +63,7 @@
                Content="⬆ åž‚直管"
                GroupName="Add"
                ToolTip="垂直管线 (V)" />
            <Separator />
            <RadioButton
                x:Name="rbAddPump"
                Margin="5"
@@ -76,6 +78,19 @@
                Content="➕ é˜€é—¨"
                GroupName="Add"
                ToolTip="阀门 (V)" />
            <Separator />
            <Button Content="视角">
                <Button.ContextMenu>
                    <ContextMenu>
                        <MenuItem Click="TopMenuItem_Click" Header="上" />
                        <MenuItem Click="BottomMenuItem_Click" Header="下" />
                        <MenuItem Click="LeftMenuItem_Click" Header="å·¦" />
                        <MenuItem Click="RightMenuItem_Click" Header="右" />
                        <MenuItem Click="FrontMenuItem_Click" Header="前" />
                        <MenuItem Click="BackMenuItem_Click" Header="后" />
                    </ContextMenu>
                </Button.ContextMenu>
            </Button>
        </ToolBar>
        <local:LogicalEditerL3d Name="editer" Grid.Row="1" />
    </Grid>
Yw.WpfUI.Test.Core/MainWindow.xaml.cs
@@ -15,7 +15,6 @@
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
            //Initialize3DScene();
        }
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
@@ -23,7 +22,6 @@
            var nw = LoadEpaNetwork();
            var nw3d = Get3dNetwork(nw);
            this.editer.Initial(nw3d);
            //BuildSimpleNetwork(this.viewport,nw3d.Nodes,nw3d.Links);
        }
        private Yw.Epanet.Network LoadEpaNetwork()
@@ -151,12 +149,12 @@
        private void AddHorizPipe_Click(object sender, RoutedEventArgs e)
        {
            this.editer.StartAddHorizPipe();
        }
        private void AddVertPipe_Click(object sender, RoutedEventArgs e)
        {
            this.editer.StartAddVertPipe();
        }
        private void AddPump_Click(object sender, RoutedEventArgs e)
@@ -168,6 +166,36 @@
        {
            this.editer.StartAddValve();
        }
        private void TopMenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.editer.SetTopView();
        }
        private void BottomMenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.editer.SetBottomView();
        }
        private void LeftMenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.editer.SetLeftView();
        }
        private void RightMenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.editer.SetRightView();
        }
        private void FrontMenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.editer.SetFrontView();
        }
        private void BackMenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.editer.SetBackView();
        }
    }