lixiaojun
2025-04-14 8b09bd446ed21cc7dc29f301c9102adaa98b76f6
增减文本辅助类
已删除2个文件
已重命名10个文件
已修改7个文件
已添加3个文件
478 ■■■■ 文件已修改
Yw.WpfUI.Hydro.L3d.Core/00-core/CatalogL3d.cs 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/01-network/01-parter/ParterL3d.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/01-network/04-link/00-core/LinkL3d.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalHighlightHelper.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalMaterialHelper.cs 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalOverrideColorHelper.cs 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalOverrideOpacityHelper.cs 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalOverrideVisibleHelper.cs 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalSelectionHelper.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalZoomHelper.cs 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/02-state/LogicalStateExtensions.cs 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/02-state/LogicalStateHelper.cs 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/02-state/eLogicalState.cs 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardText.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardTextHelper.cs 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/05-highlight/eLogicalHighlight.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/06-selection/eLogicalSelection.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/paras_hydrol3d_settings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Test.Core/MainWindow.xaml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Test.Core/MainWindow.xaml.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Yw.WpfUI.Hydro.L3d.Core/00-core/CatalogL3d.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,164 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// åˆ†ç±»
    /// </summary>
    public class CatalogL3d
    {
        /// <summary>
        /// ç»„ä»¶
        /// </summary>
        public const string Parter = "Parter";
        /// <summary>
        /// å¯è§ç»„ä»¶
        /// </summary>
        public const string Visual = "Visual";
        /// <summary>
        /// èŠ‚ç‚¹
        /// </summary>
        public const string Node = "Node";
        /// <summary>
        /// æ°´åº“
        /// </summary>
        public const string Reservoir = "Reservoir";
        /// <summary>
        /// æ°´æ± 
        /// </summary>
        public const string Tank = "Tank";
        /// <summary>
        /// æ°´ç®±
        /// </summary>
        public const string Waterbox = "Waterbox";
        /// <summary>
        /// è¿žæŽ¥èŠ‚ç‚¹
        /// </summary>
        public const string Junction = "Junction";
        /// <summary>
        /// è¿žæŽ¥ä»¶
        /// </summary>
        public const string Coupling = "Coupling";
        /// <summary>
        /// é—·å¤´
        /// </summary>
        public const string Blunthead = "Blunthead";
        /// <summary>
        /// å¼¯å¤´
        /// </summary>
        public const string Elbow = "Elbow";
        /// <summary>
        /// ä¸‰é€š
        /// </summary>
        public const string Threelink = "Threelink";
        /// <summary>
        /// å››é€š
        /// </summary>
        public const string Fourlink = "Fourlink";
        /// <summary>
        /// æ‰©æ•£å™¨
        /// </summary>
        public const string Emitter = "Emitter";
        /// <summary>
        /// å–·å¤´
        /// </summary>
        public const string Nozzle = "Nozzle";
        /// <summary>
        /// æ¶ˆç«æ “
        /// </summary>
        public const string Hydrant = "Hydrant";
        /// <summary>
        /// æ°´è¡¨
        /// </summary>
        public const string Meter = "Meter";
        /// <summary>
        /// ä»ªè¡¨
        /// </summary>
        public const string Instrument = "Instrument";
        /// <summary>
        /// æµé‡è®¡
        /// </summary>
        public const string Flowmeter = "Flowmeter";
        /// <summary>
        /// åŽ‹åŠ›è¡¨
        /// </summary>
        public const string Pressmeter = "Pressmeter";
        /// <summary>
        /// ç®¡æ®µ
        /// </summary>
        public const string Link = "Link";
        /// <summary>
        /// ç®¡é“
        /// </summary>
        public const string Pipe = "Pipe";
        /// <summary>
        /// è¿‡æ¸¡ä»¶(变径管)
        /// </summary>
        public const string Translation = "Translation";
        /// <summary>
        /// æ°´æ³µ
        /// </summary>
        public const string Pump = "Pump";
        /// <summary>
        /// é˜€é—¨
        /// </summary>
        public const string Valve = "Valve";
        /// <summary>
        /// æ°´åŠ›é˜»ä»¶
        /// </summary>
        public const string Resistance = "Resistance";
        /// <summary>
        /// æ¢çƒ­å™¨
        /// </summary>
        public const string Exchanger = "Exchanger";
        /// <summary>
        /// åŽ‹ç¼©æœº
        /// </summary>
        public const string Compressor = "Compressor";
        /// <summary>
        /// æ“ä½œ
        /// </summary>
        public const string Operation = "Operation";
        /// <summary>
        /// æ›²çº¿
        /// </summary>
        public const string Curve = "Curve";
        /// <summary>
        /// æ¨¡å¼
        /// </summary>
        public const string Pattern = "Pattern";
        /// <summary>
        /// è§„则
        /// </summary>
        public const string Rule = "Rule";
    }
}
Yw.WpfUI.Hydro.L3d.Core/01-network/01-parter/ParterL3d.cs
@@ -4,7 +4,7 @@
    /// ç»„ä»¶
    /// æ‰€æœ‰ç»„件的基类
    /// </summary>
    public abstract class ParterL3d
    public abstract class ParterL3d
    {
        /// <summary>
        /// 
@@ -17,6 +17,7 @@
        public ParterL3d(ParterL3d rhs)
        {
            this.Id = rhs.Id;
            this.Catalog = rhs.Catalog;
            this.Name = rhs.Name;
        }
@@ -26,6 +27,11 @@
        public string Id { get; set; }
        /// <summary>
        /// åˆ†ç±»
        /// </summary>
        public string Catalog { get; set; }
        /// <summary>
        /// åç§°
        /// </summary>
        public string Name { get; set; }
Yw.WpfUI.Hydro.L3d.Core/01-network/04-link/00-core/LinkL3d.cs
@@ -23,6 +23,17 @@
        }
        /// <summary>
        /// ä¸Šæ¸¸èŠ‚ç‚¹
        /// </summary>
        public NodeL3d StartNode { get; set; }
        /// <summary>
        /// ä¸‹æ¸¸èŠ‚ç‚¹
        /// </summary>
        public NodeL3d EndNode { get; set; }
        /// <summary>
        /// ä¸Šæ¸¸ä½ç½®
        /// </summary>
        public PointL3d StartPosition { get; set; }
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalHighlightHelper.cs
ÎļþÃû´Ó Yw.WpfUI.Hydro.L3d.Core/03-logical/05-highlight/LogicalHighlightHelper.cs ÐÞ¸Ä
@@ -16,7 +16,7 @@
        /// <summary>
        /// çŠ¶æ€æ”¹å˜äº‹ä»¶
        /// </summary>
        public event Action<LogicalVisual3D, eLogicalHighlight> StateChangedEvent;
        public event Action<LogicalVisual3D, bool> StateChangedEvent;
        private readonly HelixViewport3D _viewport = null;//三维组件
        private LogicalVisual3D _logicalVisual;//当前高亮的Visual
@@ -39,7 +39,7 @@
            }
            Reset();
            _logicalVisual = logicalVisual;
            this.StateChangedEvent?.Invoke(_logicalVisual, eLogicalHighlight.Load);
            this.StateChangedEvent?.Invoke(_logicalVisual, true);
        }
        //重置
@@ -47,7 +47,7 @@
        {
            if (_logicalVisual != null)
            {
                this.StateChangedEvent?.Invoke(_logicalVisual, eLogicalHighlight.Unload);
                this.StateChangedEvent?.Invoke(_logicalVisual, false);
                _logicalVisual = null;
            }
        }
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalMaterialHelper.cs
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalOverrideColorHelper.cs
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalOverrideOpacityHelper.cs
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalOverrideVisibleHelper.cs
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalSelectionHelper.cs
ÎļþÃû´Ó Yw.WpfUI.Hydro.L3d.Core/03-logical/06-selection/LogicalSelectionHelper.cs ÐÞ¸Ä
@@ -20,7 +20,7 @@
        /// <summary>
        /// çŠ¶æ€æ”¹å˜äº‹ä»¶
        /// </summary>
        public event Action<LogicalVisual3D, eLogicalSelection> StateChangedEvent;
        public event Action<LogicalVisual3D, bool> StateChangedEvent;
        private readonly HelixViewport3D _viewport;//三维组件
@@ -44,7 +44,7 @@
                return;
            }
            _selection.Add(visual);
            this.StateChangedEvent?.Invoke(visual, eLogicalSelection.Load);
            this.StateChangedEvent?.Invoke(visual, true);
        }
        //从选择中移除
@@ -55,7 +55,7 @@
                return;
            }
            _selection.Remove(visual);
            this.StateChangedEvent?.Invoke(visual, eLogicalSelection.Unload);
            this.StateChangedEvent?.Invoke(visual, false);
        }
        //清理选择
@@ -65,7 +65,7 @@
            {
                return;
            }
            _selection.ForEach(x => this.StateChangedEvent?.Invoke(x, eLogicalSelection.Unload));
            _selection.ForEach(x => this.StateChangedEvent?.Invoke(x, false));
            _selection.Clear();
        }
Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalZoomHelper.cs
Yw.WpfUI.Hydro.L3d.Core/03-logical/02-state/LogicalStateExtensions.cs
Yw.WpfUI.Hydro.L3d.Core/03-logical/02-state/LogicalStateHelper.cs
Yw.WpfUI.Hydro.L3d.Core/03-logical/02-state/eLogicalState.cs
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardText.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡å…¬å‘Šç‰Œæ–‡æœ¬
    /// </summary>
    public class LogicalBillboardText
    {
        /// <summary>
        /// æž„ä»¶id
        /// </summary>
        public string Id { get; set; }
        /// <summary>
        /// æ–‡æœ¬
        /// </summary>
        public string Text { get; set; }
    }
}
Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardTextHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡å…¬å‘Šç‰Œæ–‡æœ¬è¾…助类
    /// </summary>
    internal class LogicalBillboardTextHelper
    {
        /// <summary>
        ///
        /// </summary>
        public LogicalBillboardTextHelper(HelixViewport3D viewport)
        {
            _viewport = viewport;
        }
        private readonly HelixViewport3D _viewport = null;//三维组件
        private readonly double _fontSize = 12;//字体大小
        private readonly Brush _foregroud = Brushes.Black;//前景色
        private readonly Brush _background = Brushes.White;//背景色
        private readonly Dictionary<string, BillboardTextVisual3D> _cache = new();//缓存
        /// <summary>
        /// è®¾ç½®
        /// </summary>
        public void Set(List<LogicalBillboardText> items)
        {
            Clear();
            items?.ForEach(x => AddTextVisual3D(x));
        }
        /// <summary>
        /// æ¸…理
        /// </summary>
        public void Clear()
        {
            if (_cache.Count > 0)
            {
                foreach (var item in _cache)
                {
                    _viewport.Children.Remove(item.Value);
                }
                _cache.Clear();
            }
        }
        /// <summary>
        /// æ›´æ–°
        /// </summary>
        public void Update(LogicalBillboardText item)
        {
            if (item == null)
            {
                return;
            }
            if (_cache.ContainsKey(item.Id))
            {
                var billboardText = _cache[item.Id];
                if (billboardText != null)
                {
                    billboardText.Text = item.Text;
                }
            }
            else
            {
                AddTextVisual3D(item);
            }
        }
        /// <summary>
        /// æ›´æ–°
        /// </summary>
        public void Update(List<LogicalBillboardText> items)
        {
            items?.ForEach(x => Update(x));
        }
        //添加公告牌文本
        private void AddTextVisual3D(LogicalBillboardText item)
        {
            if (!_cache.ContainsKey(item.Id))
            {
                var billboardText = CreateTextVisual3D(item);
                if (billboardText != null)
                {
                    _cache.Add(item.Id, billboardText);
                    _viewport.Children.Add(billboardText);
                }
            }
        }
        //创建公告牌文本
        private BillboardTextVisual3D CreateTextVisual3D(LogicalBillboardText item)
        {
            if (item == null)
            {
                return default;
            }
            var logicalVisual = _viewport.Children.OfType<LogicalVisual3D>()
                .Where(x => x.Vmo.Id == item.Id).FirstOrDefault();
            if (logicalVisual == null)
            {
                return default;
            }
            var bounds = Visual3DHelper.FindBounds(logicalVisual, Transform3D.Identity);
            var position = bounds.GetCenter();
            var billboardText = new BillboardTextVisual3D();
            billboardText.Text = item.Text;
            billboardText.Foreground = _foregroud;
            billboardText.Background = _background;
            billboardText.FontSize = _fontSize;
            billboardText.Padding = new Thickness(2);
            billboardText.Position = position;
            billboardText.HorizontalAlignment = HorizontalAlignment.Left;
            billboardText.VerticalAlignment = VerticalAlignment.Bottom;
            return billboardText;
        }
    }
}
Yw.WpfUI.Hydro.L3d.Core/03-logical/05-highlight/eLogicalHighlight.cs
ÎļþÒÑɾ³ý
Yw.WpfUI.Hydro.L3d.Core/03-logical/06-selection/eLogicalSelection.cs
ÎļþÒÑɾ³ý
Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs
@@ -1,4 +1,6 @@
namespace Yw.WpfUI.Hydro
using System.Net;
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// æŠ½è±¡ç®¡ç†å™¨
@@ -16,6 +18,7 @@
            _highlightHelper = new LogicalHighlightHelper(_viewport);
            _selectionHelper = new LogicalSelectionHelper(_viewport);
            _zoomHelper = new LogicalZoomHelper(_viewport);
            _billboardTextHelper = new LogicalBillboardTextHelper(_viewport);
        }
        #region äº‹ä»¶é›†åˆ
@@ -38,6 +41,7 @@
        protected readonly LogicalHighlightHelper _highlightHelper = null;//高亮辅助类
        protected readonly LogicalSelectionHelper _selectionHelper = null;//选择辅助类
        protected readonly LogicalZoomHelper _zoomHelper = null;//缩放辅助类
        protected readonly LogicalBillboardTextHelper _billboardTextHelper = null;//公告版文字辅助类
        #endregion
@@ -363,49 +367,37 @@
        }
        //高亮状态改变事件
        private void HighlightHelper_StateChangedEvent(LogicalVisual3D logicalVisual, eLogicalHighlight highlightType)
        private void HighlightHelper_StateChangedEvent(LogicalVisual3D logicalVisual, bool operation)
        {
            if (logicalVisual == null)
            {
                return;
            }
            switch (highlightType)
            if (operation)
            {
                case eLogicalHighlight.Load:
                    {
                        _stateHelper.LoadState(logicalVisual.Vmo, eLogicalState.Highlight);
                    }
                    break;
                case eLogicalHighlight.Unload:
                    {
                        _stateHelper.UnloadState(logicalVisual.Vmo, eLogicalState.Highlight);
                    }
                    break;
                default: break;
                _stateHelper.LoadState(logicalVisual.Vmo, eLogicalState.Highlight);
            }
            else
            {
                _stateHelper.UnloadState(logicalVisual.Vmo, eLogicalState.Highlight);
            }
            logicalVisual.UpdateVisual();
        }
        //选择状态改变事件
        private void SelectionHelper_StateChangedEvent(LogicalVisual3D logicalVisual, eLogicalSelection selectionType)
        private void SelectionHelper_StateChangedEvent(LogicalVisual3D logicalVisual, bool operation)
        {
            if (logicalVisual == null)
            {
                return;
            }
            switch (selectionType)
            if (operation)
            {
                case eLogicalSelection.Load:
                    {
                        _stateHelper.LoadState(logicalVisual.Vmo, eLogicalState.Selection);
                    }
                    break;
                case eLogicalSelection.Unload:
                    {
                        _stateHelper.UnloadState(logicalVisual.Vmo, eLogicalState.Selection);
                    }
                    break;
                default: break;
                _stateHelper.LoadState(logicalVisual.Vmo, eLogicalState.Selection);
            }
            else
            {
                _stateHelper.UnloadState(logicalVisual.Vmo, eLogicalState.Selection);
            }
            logicalVisual.UpdateVisual();
        }
@@ -512,7 +504,23 @@
        #endregion
        #region å…¬å‘Šæ¿æ–‡æœ¬
        /// <summary>
        /// è®¾ç½®å…¬å‘Šæ¿æ–‡æœ¬
        /// </summary>
        public virtual void SetBillboardText(List<LogicalBillboardText> items)
        {
            if (!Initialized)
            {
                return;
            }
            _billboardTextHelper.Set(items);
        }
        #endregion
Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml.cs
@@ -126,6 +126,15 @@
        #endregion
        #region å…¬å‘Šæ¿æ–‡æœ¬
        public void SetBillboardText(List<LogicalBillboardText> items)
        {
            _manager.SetBillboardText(items);
        }
        #endregion
    }
}
Yw.WpfUI.Hydro.L3d.Core/paras_hydrol3d_settings.json
@@ -6,7 +6,7 @@
        "Logical": {
            "Node": {
                "Normal": {
                    "HtmlColor": "#0000FF",
                    "HtmlColor": "#e1300a",
                    "Radius": 0.3
                },
                "Highlight": {
Yw.WpfUI.Test.Core/MainWindow.xaml
@@ -91,6 +91,8 @@
                    </ContextMenu>
                </Button.ContextMenu>
            </Button>
            <Separator />
            <Button Content="文本" Click="BillboardText_Click"></Button>
        </ToolBar>
        <local:LogicalEditerL3d Name="editer" Grid.Row="1" />
    </Grid>
Yw.WpfUI.Test.Core/MainWindow.xaml.cs
@@ -17,11 +17,12 @@
            this.Loaded += MainWindow_Loaded;
        }
        private NetworkL3d _nw = null;
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            var nw = LoadEpaNetwork();
            var nw3d = Get3dNetwork(nw);
            this.editer.Initial(nw3d);
            _nw = Get3dNetwork(nw);
            this.editer.Initial(_nw);
        }
        private Yw.Epanet.Network LoadEpaNetwork()
@@ -196,6 +197,16 @@
        {
            this.editer.SetBackView();
        }
        private void BillboardText_Click(object sender, RoutedEventArgs e)
        {
            var list = _nw.Visuals.Select(x => new LogicalBillboardText()
            {
                Id = x.Id,
                Text = x.Id
            }).ToList();
            this.editer.SetBillboardText(list);
        }
    }