Yw.WpfUI.Hydro.L3d.Core/03-logical/00-core/LogicalGridLineHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,162 @@ namespace Yw.WpfUI.Hydro { /// <summary> /// æ½è±¡ç½æ ¼çº¿è¾ å©ç±» /// </summary> internal class LogicalGridLineHelper { /// <summary> /// /// </summary> public LogicalGridLineHelper(HelixViewport3D viewport) { _viewport = viewport; _gridLines = CreateGridLinesVisual3D(); _viewport.CameraChanged += Viewport_CameraChanged; } private readonly HelixViewport3D _viewport = null;//ä¸ç»´ç»ä»¶ private readonly GridLinesVisual3D _gridLines = null;//ç½æ ¼çº¿ /// <summary> /// æ¾ç¤ºç½æ ¼çº¿ /// </summary> public void Show() { var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault(); if (gridLines == null) { _gridLines.Visible = true; _viewport.Children.Add(_gridLines); UpdateGridLinesVisual3D(); } else { gridLines.Visible = true; } } /// <summary> /// éèç½æ ¼çº¿ /// </summary> public void Hide() { var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault(); if (gridLines != null) { gridLines.Visible = false; } } /// <summary> /// å¯è§æ§ /// </summary> public bool Visible { get { var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault(); if (gridLines == null) { return false; } if (!gridLines.Visible) { return false; } return true; } set { if (value) { Show(); } else { Hide(); } } } //åå»ºç½æ ¼çº¿ private GridLinesVisual3D CreateGridLinesVisual3D() { var gridLines = new GridLinesVisual3D(); gridLines.Thickness = 0.05; gridLines.MajorDistance = 5; gridLines.MinorDistance = 1; gridLines.Fill = Brushes.Black; return gridLines; } //ç¸æºæ¹å private void Viewport_CameraChanged(object sender, RoutedEventArgs e) { UpdateGridLinesVisual3D(); } // æ´æ°ç½æ ¼å¤§å°çæ¹æ³ private void UpdateGridLinesVisual3D() { var gridLines = _viewport.Children.OfType<GridLinesVisual3D>().FirstOrDefault(); if (gridLines == null) { return; } if (!gridLines.Visible) { return; } Rect3D bounds = Rect3D.Empty; foreach (Visual3D child in _viewport.Children.OfType<LogicalVisual3D>()) { if (!(child is IBoundsIgnoredVisual3D)) { Rect3D rect = child.FindBounds(Transform3D.Identity); bounds.Union(rect); } } if (!bounds.IsEmpty) { // è®¡ç®æå¤§å°ºå¯¸å¹¶å¢å 20%è¾¹è· double maxSize = Math.Max(bounds.SizeX, Math.Max(bounds.SizeY, bounds.SizeZ)) * 1.5; // è®¾ç½®ç½æ ¼å¤§å° gridLines.Width = maxSize; gridLines.Length = maxSize; // ä¿æç½æ ¼å± ä¸ gridLines.Center = new Point3D( bounds.X + bounds.SizeX / 2, bounds.Y + bounds.SizeY / 2, 0); // æ ¹æ®å°ºå¯¸èªå¨è°æ´ç½æ ¼å¯åº¦ gridLines.MinorDistance = Math.Max(1, maxSize / 20d); gridLines.MajorDistance = gridLines.MinorDistance * 5; } else { // é»è®¤å¤§å°ï¼å½åºæ¯ä¸ºç©ºæ¶ï¼ gridLines.Width = 100; gridLines.Length = 100; gridLines.Center = new Point3D(0, 0, 0); } } } } Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardLeadLabelHelper.cs
ÎļþÃû´Ó Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardTextHelper.cs ÐÞ¸Ä @@ -1,14 +1,14 @@ namespace Yw.WpfUI.Hydro { /// <summary> /// æ½è±¡å ¬åçææ¬è¾ å©ç±» /// æ½è±¡å¼çº¿æ ç¾è¾ å©ç±» /// </summary> internal class LogicalBillboardTextHelper internal class LogicalBillboardLeadLabelHelper { /// <summary> /// /// </summary> public LogicalBillboardTextHelper(HelixViewport3D viewport) public LogicalBillboardLeadLabelHelper(HelixViewport3D viewport) { _viewport = viewport; } @@ -16,13 +16,14 @@ private readonly HelixViewport3D _viewport = null;//ä¸ç»´ç»ä»¶ private readonly double _fontSize = 12;//åä½å¤§å° private readonly Brush _foregroud = Brushes.Black;//åæ¯è² private readonly Brush _background = Brushes.White;//èæ¯è² private readonly Brush _background = Brushes.Transparent;//èæ¯è² private readonly Brush _borderbrush = Brushes.Transparent;//è¾¹æ¡è² private readonly Dictionary<string, BillboardTextVisual3D> _cache = new();//ç¼å /// <summary> /// 设置 /// </summary> public void Set(List<LogicalBillboardText> items) public void Set(List<LogicalTextL3d> items) { Clear(); items?.ForEach(x => AddTextVisual3D(x)); @@ -46,7 +47,7 @@ /// <summary> /// æ´æ° /// </summary> public void Update(LogicalBillboardText item) public void Update(LogicalTextL3d item) { if (item == null) { @@ -69,14 +70,14 @@ /// <summary> /// æ´æ° /// </summary> public void Update(List<LogicalBillboardText> items) public void Update(List<LogicalTextL3d> items) { items?.ForEach(x => Update(x)); } //æ·»å å ¬åçææ¬ private void AddTextVisual3D(LogicalBillboardText item) private void AddTextVisual3D(LogicalTextL3d item) { if (!_cache.ContainsKey(item.Id)) { @@ -90,7 +91,7 @@ } //åå»ºå ¬åçææ¬ private BillboardTextVisual3D CreateTextVisual3D(LogicalBillboardText item) private BillboardTextVisual3D CreateTextVisual3D(LogicalTextL3d item) { if (item == null) { @@ -110,13 +111,12 @@ billboardText.Text = item.Text; billboardText.Foreground = _foregroud; billboardText.Background = _background; billboardText.BorderBrush = _borderbrush; 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/03-text/LogicalBillboardLeadLabelVisual3D.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,10 @@ namespace Yw.WpfUI.Hydro { /// <summary> /// æ½è±¡å¼çº¿æ ç¾ /// </summary> public class LogicalBillboardLeadLabelVisual3D : ModelVisual3D { } } Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalTextL3d.cs
ÎļþÃû´Ó Yw.WpfUI.Hydro.L3d.Core/03-logical/03-text/LogicalBillboardText.cs ÐÞ¸Ä @@ -1,9 +1,9 @@ namespace Yw.WpfUI.Hydro { /// <summary> /// æ½è±¡å ¬åçææ¬ /// æ½è±¡ææ¬ /// </summary> public class LogicalBillboardText public class LogicalTextL3d { /// <summary> /// æä»¶id @@ -15,6 +15,10 @@ /// </summary> public string Text { get; set; } /// <summary> /// è·ç¦» /// </summary> public int? Distance { get; set; } } Yw.WpfUI.Hydro.L3d.Core/03-logical/04-backgroud/LogicalBackgroudHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,102 @@ namespace Yw.WpfUI.Hydro { /// <summary> /// æ½è±¡èæ¯è¾ å©ç±» /// </summary> internal class LogicalBackgroudHelper { /// <summary> /// /// </summary> public LogicalBackgroudHelper(HelixViewport3D viewport) { _viewport = viewport; _backgroud = new LogicalBackgroudVisual3D(); } private readonly HelixViewport3D _viewport = null;//ä¸ç»´ç»ä»¶ private readonly LogicalBackgroudVisual3D _backgroud = null;//èæ¯ /// <summary> /// æ¾ç¤ºèæ¯ /// </summary> public void Show() { var bc = _viewport.Children.OfType<LogicalBackgroudVisual3D>().FirstOrDefault(); if (bc == null) { _backgroud.Visible = true; _viewport.Children.Add(_backgroud); } else { bc.Visible = true; } } /// <summary> /// éèèæ¯ /// </summary> public void Hide() { var bc = _viewport.Children.OfType<LogicalBackgroudVisual3D>().FirstOrDefault(); if (bc != null) { bc.Visible = false; } } /// <summary> /// å¯è§æ§ /// </summary> public bool Visible { get { var bc = _viewport.Children.OfType<LogicalBackgroudVisual3D>().FirstOrDefault(); if (bc == null) { return false; } if (!bc.Visible) { return false; } return true; } set { if (value) { Show(); } else { Hide(); } } } /// <summary> /// è®¾ç½®èæ¯ /// </summary> public void Set(string url) { var bitmap = new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute)); _backgroud.UpdateVisual(bitmap); } /// <summary> /// è®¾ç½®èæ¯ /// </summary> public void Set(string url, double width, double height) { var bitmap = new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute)); _backgroud.UpdateVisual(bitmap, width, height); } } } Yw.WpfUI.Hydro.L3d.Core/03-logical/04-backgroud/LogicalBackgroudVisual3D.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,111 @@ namespace Yw.WpfUI.Hydro { /// <summary> /// æ½è±¡èæ¯ /// </summary> internal class LogicalBackgroudVisual3D : MeshGeometryVisual3D { /// <summary> /// /// </summary> public LogicalBackgroudVisual3D() { UpdateVisual(); } /// <summary> /// /// </summary> public LogicalBackgroudVisual3D(BitmapImage bitmap) : this() { _bitmap = bitmap; _width = bitmap.Width; _height = bitmap.Height; } /// <summary> /// /// </summary> public LogicalBackgroudVisual3D(BitmapImage bitmap, double width, double height) : this() { _bitmap = bitmap; _width = width; _height = height; } private BitmapImage _bitmap = null;//èæ¯å¾ç private double _width = 100d;//èæ¯å®½åº¦ private double _height = 100d;//èæ¯é«åº¦ //æ´æ°æè´¨ private void UpdateMaterial() { Material material = null; if (_bitmap == null) { material = MaterialHelper.CreateMaterial(Colors.Black); } else { material = MaterialHelper.CreateImageMaterial(_bitmap, 1.0); } this.Material = material; } //æ´æ°å ä½å¾å½¢ private void UpdateGeometry() { double halfWidth = _width / 2; double halfHeight = _height / 2; var meshBuilder = new MeshBuilder(); // å建平é¢ç½æ ¼ meshBuilder.AddQuad( new Point3D(-halfWidth, -halfHeight, 0), // å·¦ä¸ new Point3D(halfWidth, -halfHeight, 0), // å³ä¸ new Point3D(halfWidth, halfHeight, 0), // å³ä¸ new Point3D(-halfWidth, halfHeight, 0)); // å·¦ä¸ var geometry = meshBuilder.ToMesh(); this.MeshGeometry = geometry; } /// <summary> /// æ´æ°å¯è§å ç´ /// </summary> public void UpdateVisual() { this.UpdateGeometry(); this.UpdateMaterial(); } /// <summary> /// æ´æ°å¯è§å ç´ /// </summary> public void UpdateVisual(BitmapImage bitmap) { _bitmap = bitmap; _width = bitmap.Width; _height = bitmap.Height; UpdateVisual(); } /// <summary> /// æ´æ°å¯è§å ç´ /// </summary> public void UpdateVisual(BitmapImage bitmap, double width, double height) { _bitmap = bitmap; _width = width; _height = height; UpdateVisual(); } } } Yw.WpfUI.Hydro.L3d.Core/03-logical/08-manager/LogicalManager.cs
@@ -15,10 +15,12 @@ _overrideColorHelper = new LogicalOverrideColorHelper(); _overrideOpacityHelper = new LogicalOverrideOpacityHelper(); _overrideVisibleHelper = new LogicalOverrideVisibleHelper(); _backgroundHelper = new LogicalBackgroudHelper(_viewport); _gridLinesHelper = new LogicalGridLineHelper(_viewport); _highlightHelper = new LogicalHighlightHelper(_viewport); _selectionHelper = new LogicalSelectionHelper(_viewport); _zoomHelper = new LogicalZoomHelper(_viewport); _billboardTextHelper = new LogicalBillboardTextHelper(_viewport); _billboardTextHelper = new LogicalBillboardLeadLabelHelper(_viewport); } #region äºä»¶éå @@ -38,10 +40,12 @@ protected readonly LogicalOverrideColorHelper _overrideColorHelper = null;//è¦çé¢è²è¾ å©ç±» protected readonly LogicalOverrideOpacityHelper _overrideOpacityHelper = null;//è¦çéæåº¦è¾ å©ç±» protected readonly LogicalOverrideVisibleHelper _overrideVisibleHelper = null;//è¦çå¯è§æ§è¾ å©ç±» protected readonly LogicalBackgroudHelper _backgroundHelper = null;//èæ¯è¾ å©ç±» protected readonly LogicalGridLineHelper _gridLinesHelper = null;//ç½æ ¼çº¿è¾ å©ç±» protected readonly LogicalHighlightHelper _highlightHelper = null;//é«äº®è¾ å©ç±» protected readonly LogicalSelectionHelper _selectionHelper = null;//éæ©è¾ å©ç±» protected readonly LogicalZoomHelper _zoomHelper = null;//缩æ¾è¾ å©ç±» protected readonly LogicalBillboardTextHelper _billboardTextHelper = null;//å ¬åçæåè¾ å©ç±» protected readonly LogicalBillboardLeadLabelHelper _billboardTextHelper = null;//å ¬åçæåè¾ å©ç±» #endregion @@ -503,13 +507,138 @@ #endregion #region èæ¯ /// <summary> /// æ¾ç¤ºèæ¯ /// </summary> public virtual void ShowBackgroud() { if (!Initialized) { return; } _backgroundHelper.Show(); } /// <summary> /// éèèæ¯ /// </summary> public virtual void HideBackgroud() { if (!Initialized) { return; } _backgroundHelper.Hide(); } /// <summary> /// èæ¯å¯è§æ§ /// </summary> public virtual bool BackgroudVisible { get { if (!Initialized) { return false; } return _backgroundHelper.Visible; } set { if (!Initialized) { return; } _backgroundHelper.Visible = value; } } /// <summary> /// è®¾ç½®èæ¯ /// </summary> public virtual void SetBackgroud(string url) { if (!Initialized) { return; } _backgroundHelper.Set(url); } /// <summary> /// è®¾ç½®èæ¯ /// </summary> public virtual void SetBackgroud(string url, double width, double height) { if (!Initialized) { return; } _backgroundHelper.Set(url, width, height); } #endregion #region ç½æ ¼çº¿ /// <summary> /// æ¾ç¤ºç½æ ¼çº¿ /// </summary> public virtual void ShowGridLines() { if (!Initialized) { return; } _gridLinesHelper.Show(); } /// <summary> /// éèç½æ ¼çº¿ /// </summary> public virtual void HideGridLines() { if (!Initialized) { return; } _gridLinesHelper.Hide(); } /// <summary> /// ç½æ ¼çº¿å¯è§æ§ /// </summary> public virtual bool GridLinesVisible { get { if (!Initialized) { return false; } return _gridLinesHelper.Visible; } set { if (!Initialized) { return; } _gridLinesHelper.Visible = value; } } #endregion #region å ¬åæ¿ææ¬ /// <summary> /// è®¾ç½®å ¬åæ¿ææ¬ /// </summary> public virtual void SetBillboardText(List<LogicalBillboardText> items) public virtual void SetBillboardText(List<LogicalTextL3d> items) { if (!Initialized) { @@ -518,6 +647,41 @@ _billboardTextHelper.Set(items); } /// <summary> /// æ´æ°å ¬åæ¿ææ¬ /// </summary> public virtual void UpdateBillboardText(LogicalTextL3d item) { if (!Initialized) { return; } _billboardTextHelper.Update(item); } /// <summary> /// æ´æ°å ¬åæ¿ææ¬ /// </summary> public virtual void UpdateBillboardText(List<LogicalTextL3d> items) { if (!Initialized) { return; } _billboardTextHelper.Update(items); } /// <summary> /// æ¸ çå ¬åæ¿ææ¬ /// </summary> public virtual void ClearBillboardText() { if (!Initialized) { return; } _billboardTextHelper.Clear(); } #endregion Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml
@@ -14,7 +14,6 @@ x:Name="viewport" ShowCoordinateSystem="True" ZoomExtentsWhenLoaded="True"> <hx:DefaultLights /> </hx:HelixViewport3D> </Grid> </UserControl> Yw.WpfUI.Hydro.L3d.Core/03-logical/09-control/LogicalEditerL3d.xaml.cs
@@ -128,13 +128,78 @@ #region å ¬åæ¿ææ¬ public void SetBillboardText(List<LogicalBillboardText> items) public void SetBillboardText(List<LogicalTextL3d> items) { _manager.SetBillboardText(items); } #endregion #region ç½æ ¼çº¿ /// <summary> /// æ¾ç¤ºç½æ ¼çº¿ /// </summary> public void ShowGridLines() { _manager.ShowGridLines(); } /// <summary> /// éèç½æ ¼çº¿ /// </summary> public void HideGridLines() { _manager.HideGridLines(); } /// <summary> /// ç½æ ¼çº¿å¯è§æ§ /// </summary> public bool GridLinesVisible { get { return _manager.GridLinesVisible; } set { _manager.GridLinesVisible = value; } } #endregion #region èæ¯ /// <summary> /// æ¾ç¤ºèæ¯ /// </summary> public void ShowBackgroud() { _manager.ShowBackgroud(); } /// <summary> /// éèèæ¯ /// </summary> public void HideBackgroud() { _manager.HideBackgroud(); } /// <summary> /// èæ¯å¯è§æ§ /// </summary> public bool BackgroudVisible { get { return _manager.BackgroudVisible; } set { _manager.BackgroudVisible = value; } } /// <summary> /// è®¾ç½®èæ¯ /// </summary> public void SetBackgroud(string url) { _manager.SetBackgroud(url); } #endregion } } Yw.WpfUI.Hydro.L3d.Core/GlobalUsings.cs
@@ -7,3 +7,4 @@ global using System.Text; global using System.IO; global using System.Windows.Input; global using System.Windows.Media.Imaging; Yw.WpfUI.Test.Core/MainWindow.xaml
@@ -92,7 +92,18 @@ </Button.ContextMenu> </Button> <Separator /> <Button Content="ææ¬" Click="BillboardText_Click"></Button> <Button Click="BillboardText_Click" Content="ææ¬" /> <CheckBox Name="ckGridLines" Checked="CheckBox_Checked" Content="ç½æ ¼çº¿" Unchecked="ckGridLines_Unchecked" /> <Separator /> <CheckBox Name="ckBackgroud" Checked="ckBackgroud_Checked" Content="èæ¯" Unchecked="ckBackgroud_Unchecked" /> </ToolBar> <local:LogicalEditerL3d Name="editer" Grid.Row="1" /> </Grid> Yw.WpfUI.Test.Core/MainWindow.xaml.cs
@@ -200,13 +200,34 @@ private void BillboardText_Click(object sender, RoutedEventArgs e) { var list = _nw.Visuals.Select(x => new LogicalBillboardText() var list = _nw.Visuals.Select(x => new LogicalTextL3d() { Id = x.Id, Text = x.Id }).ToList(); this.editer.SetBillboardText(list); } private void CheckBox_Checked(object sender, RoutedEventArgs e) { this.editer.GridLinesVisible = true; } private void ckGridLines_Unchecked(object sender, RoutedEventArgs e) { this.editer.GridLinesVisible = false; } private void ckBackgroud_Checked(object sender, RoutedEventArgs e) { this.editer.BackgroudVisible = true; this.editer.SetBackgroud("mt.png"); } private void ckBackgroud_Unchecked(object sender, RoutedEventArgs e) { this.editer.BackgroudVisible = false; } }