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