Yw.WinFrmUI.Hydro.L3d2.Core/EditerL3d2.Designer.cs
@@ -17,6 +17,7 @@ { components.Dispose(); } Close(); base.Dispose(disposing); } Yw.WinFrmUI.Hydro.L3d2.Core/EditerL3d2.cs
@@ -8,6 +8,7 @@ public EditerL3d2() { InitializeComponent(); } #region 事件集合 @@ -15,7 +16,12 @@ /// <summary> /// 选择改变事件 /// </summary> public event Action<List<Yw.WpfUI.Hydro.VisualL3d>> SelectionChangedEvent; public event Action<List<VisualL3d>> SelectionChangedEvent; /// <summary> /// 编辑改变事件 /// </summary> public event Action<List<VisualL3d>> EditChangedEvent; #endregion @@ -40,7 +46,8 @@ private void InitialWpfControl() { _wpfViewer = new WpfUI.Hydro.EditerL3d(); _wpfViewer.SelectionChangedEvent += (visuals) => this.SelectionChangedEvent?.Invoke(visuals); _wpfViewer.SelectionChangedEvent += OnSelectionChanged; _wpfViewer.EditChangedEvent += OnEditChanged; var elementHost = new ElementHost(); elementHost.Dock = DockStyle.Fill; elementHost.Child = _wpfViewer; @@ -274,6 +281,12 @@ public void SelectVisual(List<string> Ids) { _wpfViewer?.SelectVisual(Ids); } //处理选择改变 protected virtual void OnSelectionChanged(List<VisualL3d> visuals) { this.SelectionChangedEvent?.Invoke(visuals); } #endregion @@ -617,8 +630,27 @@ _wpfViewer?.EndEdit(); } //处理编辑改变 protected virtual void OnEditChanged(List<VisualL3d> visuals) { if (visuals == null || visuals.Count < 1) { return; } this.EditChangedEvent?.Invoke(visuals); } #endregion //关闭 protected virtual void Close() { if (_wpfViewer != null) { _wpfViewer.EditChangedEvent -= OnEditChanged; _wpfViewer.SelectionChangedEvent -= OnSelectionChanged; } } } } Yw.WinFrmUI.Hydro.L3d2.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -2,7 +2,7 @@ <!-- https://go.microsoft.com/fwlink/?LinkID=208121. --> <Project> <PropertyGroup> <History>True|2025-05-06T06:03:10.9343885Z||;True|2025-05-06T12:25:07.7448966+08:00||;True|2025-05-06T12:20:11.7083540+08:00||;True|2025-05-06T12:20:05.9513514+08:00||;True|2025-05-06T10:51:28.7337521+08:00||;True|2025-05-06T10:51:06.6456811+08:00||;True|2025-05-06T10:50:58.8911173+08:00||;True|2025-05-06T10:34:44.8136252+08:00||;True|2025-05-06T10:34:27.7212544+08:00||;True|2025-05-06T10:16:30.5074881+08:00||;True|2025-05-06T09:07:27.2170966+08:00||;True|2025-04-22T15:50:06.4794535+08:00||;True|2025-04-03T15:07:50.7868897+08:00||;True|2025-04-03T14:53:27.6125391+08:00||;True|2025-04-03T14:09:06.0738035+08:00||;</History> <History>True|2025-05-06T08:07:50.2792890Z||;True|2025-05-06T16:07:36.7788692+08:00||;True|2025-05-06T14:03:10.9343885+08:00||;True|2025-05-06T12:25:07.7448966+08:00||;True|2025-05-06T12:20:11.7083540+08:00||;True|2025-05-06T12:20:05.9513514+08:00||;True|2025-05-06T10:51:28.7337521+08:00||;True|2025-05-06T10:51:06.6456811+08:00||;True|2025-05-06T10:50:58.8911173+08:00||;True|2025-05-06T10:34:44.8136252+08:00||;True|2025-05-06T10:34:27.7212544+08:00||;True|2025-05-06T10:16:30.5074881+08:00||;True|2025-05-06T09:07:27.2170966+08:00||;True|2025-04-22T15:50:06.4794535+08:00||;True|2025-04-03T15:07:50.7868897+08:00||;True|2025-04-03T14:53:27.6125391+08:00||;True|2025-04-03T14:09:06.0738035+08:00||;</History> <LastFailureDetails /> </PropertyGroup> </Project> Yw.WinFrmUI.Hydro.L3d2.Core/Yw.WinFrmUI.Hydro.L3d2.Core.csproj
@@ -8,11 +8,11 @@ <OutputType>Library</OutputType> <UseWPF>True</UseWPF> <GeneratePackageOnBuild>True</GeneratePackageOnBuild> <Version>1.1.1</Version> <Version>1.1.2</Version> </PropertyGroup> <ItemGroup> <PackageReference Include="Yw.WpfUI.Hydro.L3d.Core" Version="1.1.1" /> <PackageReference Include="Yw.WpfUI.Hydro.L3d.Core" Version="1.1.2" /> </ItemGroup> <ItemGroup> Yw.WpfUI.Hydro.L3d.Core/03-draw/00-core/01-initial/DrawInitialHelper.cs
@@ -142,6 +142,18 @@ } /// <summary> /// 获取Node3D /// </summary> public List<NodeDraw3D> GetNode3D() { if (!Initialized) { return default; } return _allVisual3dDict.Values.Where(x => x is NodeDraw3D).Select(x => x as NodeDraw3D).ToList(); } /// <summary> /// 获取Link3D /// </summary> public List<LinkDraw3D> GetLink3D() @@ -154,6 +166,65 @@ } /// <summary> /// 获取连接的Link3D /// </summary> public List<LinkDraw3D> GetConnectLink3D(NodeDraw3D node3d) { if (!Initialized) { return default; } var node = node3d.Visual; var link3ds = GetLink3D(); return link3ds.Where(x => x.Visual.StartNode == node || x.Visual.EndNode == node).ToList(); } /// <summary> /// 获取连接的Node3D /// </summary> public List<NodeDraw3D> GetConnectNode3D(LinkDraw3D link3d) { if (!Initialized) { return default; } var node3ds = GetNode3D(); return node3ds.Where(x => x.Visual == link3d.Visual.StartNode || x.Visual == link3d.Visual.EndNode).ToList(); } /// <summary> /// 获取连接的Visual3D /// </summary> public List<VisualDraw3D> GetConnect3D(VisualDraw3D visual3d) { if (!Initialized) { return default; } var list = new List<VisualDraw3D>(); if (visual3d is NodeDraw3D node3d) { var link3ds = GetConnectLink3D(node3d); link3ds?.ForEach(x => list.Add(x)); return list; } if (visual3d is LinkDraw3D link3d) { var node3ds = GetConnectNode3D(link3d); if (node3ds != null && node3ds.Count > 0) { foreach (var item in node3ds) { list.Add(item); var link3ds = GetConnectLink3D(item); link3ds?.ForEach(x => list.Add(x)); } } } return list; } /// <summary> /// 添加Visual3D /// </summary> public bool AddVisual3D(VisualDraw3D visual3d) Yw.WpfUI.Hydro.L3d.Core/03-draw/00-core/07-selection/DrawSelectionHelper.cs
@@ -88,8 +88,11 @@ //处理鼠标弹起 private void OnMouseUp(object sender, MouseButtonEventArgs e) { var pt = e.GetPosition(_viewport); Handle(pt); if (e.ChangedButton == MouseButton.Left) { var pt = e.GetPosition(_viewport); Handle(pt); } } Yw.WpfUI.Hydro.L3d.Core/03-draw/00-core/14-edit/DrawEditHelper.cs
@@ -18,7 +18,17 @@ _viewport = viewport; _initialHelper = initialHelper; _selectionHelper = selectionHelper; Attach(); } #region 事件集合 /// <summary> /// 编辑改变事件 /// </summary> public event Action<List<VisualDraw3D>> EditChangedEvent; #endregion private readonly HelixViewport3D _viewport = null;//三维组件 private readonly DrawInitialHelper _initialHelper = null;//初始化辅助类 @@ -26,27 +36,81 @@ private EditDraw3D _editer = null;//编辑器 /// <summary> /// 是否初始化 /// </summary> public bool Initialized { get { return _initialized; } private set { _initialized = value; } } private bool _initialized = false; //初始化 private void Initialize() { if (!_initialHelper.Initialized) { return; } _initialized = true; } //处理初始化完成 private void OnInitialCompleted() { Initialize(); } /// <summary> /// 开始 /// </summary> public void Start() { Cancel(); _editer = new EditDraw3D(_viewport, _selectionHelper); if (!Initialized) { return; } End(); _editer = new EditDraw3D(_viewport, _initialHelper, _selectionHelper); _editer.EditChangedEvent += OnEditChanged; _editer.Initial(_selectionHelper.Selection); _viewport.Children.Add(_editer); } /// <summary> /// 取消 /// 结束 /// </summary> public void Cancel() public void End() { if (!Initialized) { return; } if (_editer != null) { _editer.EditChangedEvent -= OnEditChanged; _editer.Dispose(); _viewport.Children.Remove(_editer); _editer = null; } } //处理编辑改变 private void OnEditChanged(List<VisualDraw3D> list) { this.EditChangedEvent?.Invoke(list); } //附加 private void Attach() { _initialHelper.InitialCompletedEvent += OnInitialCompleted; } //分离 private void Detach() { _initialHelper.InitialCompletedEvent -= OnInitialCompleted; } /// <summary> @@ -54,8 +118,10 @@ /// </summary> public void Dispose() { Detach(); } } } Yw.WpfUI.Hydro.L3d.Core/03-draw/00-core/14-edit/EditDraw3D.cs
@@ -8,18 +8,41 @@ /// <summary> /// /// </summary> public EditDraw3D(HelixViewport3D viewport, DrawSelectionHelper selectionHelper) public EditDraw3D ( HelixViewport3D viewport, DrawInitialHelper initialHelper, DrawSelectionHelper selectionHelper ) { _viewport = viewport; _initialHelper = initialHelper; _selectionHelper = selectionHelper; Attach(); } #region 固定资源 private const double ArrowLength = 5;//箭头长度 private const double ArrowDiameter = 0.2;//箭头直径 private const double ArrowHeadLength = 3;//箭头头部长度 private const double ArrowHeadLength = 3;//箭头头部长度 #endregion #region 事件集合 /// <summary> /// 编辑改变事件 /// </summary> public event Action<List<VisualDraw3D>> EditChangedEvent; #endregion private readonly HelixViewport3D _viewport = null; //三维组件 private readonly DrawInitialHelper _initialHelper = null; //初始化辅助类 private readonly DrawSelectionHelper _selectionHelper = null;//选择辅助类 private ArrowVisual3D _xarrow = null; //X轴箭头 private ArrowVisual3D _yarrow = null;//y轴箭头 private ArrowVisual3D _zarrow = null;//z轴箭头 @@ -153,6 +176,12 @@ { x.Offset(offset); x.UpdateVisual3D(); var visual3ds = _initialHelper.GetConnect3D(x); visual3ds?.ForEach(x => { x.UpdatePositions(); x.UpdateVisual3D(); }); }); _xarrow.Point1 += offset; @@ -172,9 +201,37 @@ _currentArrow = null; _viewport.Cursor = Cursors.Arrow; _selectionHelper.Enabled = _lastSelectionEnabled; OnEditChanged(); } } //处理编辑改变 private void OnEditChanged() { var selection = _selectionHelper.Selection; if (selection == null || selection.Count < 1) { return; } var list = new List<VisualDraw3D>(); selection.ForEach(x => { if (!list.Contains(x)) { list.Add(x); var visual3ds = _initialHelper.GetConnect3D(x); visual3ds?.ForEach(y => { if (!list.Contains(y)) { list.Add(y); } }); } }); this.EditChangedEvent?.Invoke(list); } //附加 private void Attach() { Yw.WpfUI.Hydro.L3d.Core/03-draw/02-manager/DrawEditManager.cs
@@ -12,11 +12,21 @@ { _addHelper = new DrawAddHelper(viewport, _initialHelper); _editHelper = new DrawEditHelper(viewport, _initialHelper, _selectionHelper); _editHelper.EditChangedEvent += OnEditChanged; } #region 事件集合 /// <summary> /// 编辑改变事件 /// </summary> public event Action<List<VisualL3d>> EditChangedEvent; #endregion protected readonly DrawAddHelper _addHelper = null;//添加辅助类 protected readonly DrawEditHelper _editHelper = null;//编辑辅助类 #region 添加方法 @@ -62,92 +72,31 @@ /// </summary> public void EndEdit() { _editHelper.Cancel(); _editHelper.End(); } //处理编辑改变 protected virtual void OnEditChanged(List<VisualDraw3D> visual3ds) { if (visual3ds == null || visual3ds.Count < 1) { return; } var visuals = visual3ds.Select(x => x.Visual).ToList(); this.EditChangedEvent?.Invoke(visuals); } #endregion #region 构件方法 //创建抽象可见元素 private VisualDraw3D CreateLogicalVisual(VisualL3d visual) /// <summary> /// 关闭 /// </summary> public override void Close() { return default; //var logicalVisual = DrawCreateHelper.Create(visual, _stateHelper, _materialHelper, _overrideColorHelper, _overrideOpacityHelper, _overrideVisibleHelper); //return logicalVisual; _editHelper.EditChangedEvent -= OnEditChanged; _editHelper.Dispose(); base.Close(); } //添加抽象可见元素 private void AddLogicalVisual(VisualDraw3D logicalVisual) { if (!Initialized) { return; } //if (logicalVisual == null) //{ // return; //} //if (logicalVisual.Vmo == null) //{ // return; //} //var visual = logicalVisual.Vmo; //if (!_nw.IsExist(visual)) //{ // _nw.Append(visual, out _); //} //if (!_allVisualL3dDict.ContainsKey(visual.Id)) //{ // _allVisualL3dDict.Add(visual.Id, visual); //} //if (!_allVisualLogicalDict.ContainsKey(visual)) //{ // _allVisualLogicalDict.Add(visual, logicalVisual); //} //if (!_viewport.Children.Contains(logicalVisual)) //{ // _viewport.Children.Add(logicalVisual); //} } //移除抽象可见元素 private void RemoveLogicalVisual(VisualDraw3D logicalVisual) { if (!Initialized) { return; } //if (logicalVisual == null) //{ // return; //} //if (logicalVisual.Vmo == null) //{ // return; //} //var visual = logicalVisual.Vmo; //if (_nw.IsExist(visual)) //{ // _nw.Remove(visual); //} //if (_allVisualL3dDict.ContainsKey(visual.Id)) //{ // _allVisualL3dDict.Remove(visual.Id); //} //if (_allVisualLogicalDict.ContainsKey(visual)) //{ // _allVisualLogicalDict.Remove(visual); //} //if (_viewport.Children.Contains(logicalVisual)) //{ // _viewport.Children.Remove(logicalVisual); //} } #endregion Yw.WpfUI.Hydro.L3d.Core/03-draw/03-control/EditerL3d.xaml.cs
@@ -20,6 +20,11 @@ /// </summary> public event Action<List<VisualL3d>> SelectionChangedEvent; /// <summary> /// 编辑改变事件 /// </summary> public event Action<List<VisualL3d>> EditChangedEvent; #endregion #region 私有字段 @@ -38,7 +43,8 @@ { _manager = new DrawEditManager(this.viewport); _manager.Initial(nw); _manager.SelectionChangedEvent += (List<VisualL3d> visuals) => this.SelectionChangedEvent?.Invoke(visuals); _manager.SelectionChangedEvent += (visuals) => this.SelectionChangedEvent?.Invoke(visuals); _manager.EditChangedEvent += OnEditChanged; } @@ -631,6 +637,12 @@ _manager?.EndEdit(); } //处理编辑改变 private void OnEditChanged(List<VisualL3d> visuals) { this.EditChangedEvent?.Invoke(visuals); } #endregion /// <summary> @@ -638,8 +650,12 @@ /// </summary> private void OnUnloaded(object sender, RoutedEventArgs e) { _manager?.Close(); _manager = null; if (_manager != null) { _manager.EditChangedEvent -= OnEditChanged; _manager?.Close(); _manager = null; } } } Yw.WpfUI.Hydro.L3d.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -2,7 +2,7 @@ <!-- https://go.microsoft.com/fwlink/?LinkID=208121. --> <Project> <PropertyGroup> <History>True|2025-05-06T05:56:55.7963451Z||;False|2025-05-06T13:56:30.4192182+08:00||;True|2025-05-06T12:24:06.1275328+08:00||;True|2025-05-06T12:17:30.5477075+08:00||;True|2025-05-06T12:09:02.1715202+08:00||;True|2025-05-06T10:48:14.2754277+08:00||;True|2025-05-06T10:31:56.4341238+08:00||;True|2025-05-06T10:11:06.0348707+08:00||;True|2025-05-06T10:11:00.3082825+08:00||;False|2025-05-06T10:10:39.1136970+08:00||;True|2025-05-06T09:05:16.4695917+08:00||;True|2025-04-22T15:43:19.8599243+08:00||;True|2025-04-03T14:51:22.5389895+08:00||;True|2025-04-03T13:39:16.2049845+08:00||;</History> <History>True|2025-05-06T07:58:43.9672087Z||;True|2025-05-06T13:56:55.7963451+08:00||;False|2025-05-06T13:56:30.4192182+08:00||;True|2025-05-06T12:24:06.1275328+08:00||;True|2025-05-06T12:17:30.5477075+08:00||;True|2025-05-06T12:09:02.1715202+08:00||;True|2025-05-06T10:48:14.2754277+08:00||;True|2025-05-06T10:31:56.4341238+08:00||;True|2025-05-06T10:11:06.0348707+08:00||;True|2025-05-06T10:11:00.3082825+08:00||;False|2025-05-06T10:10:39.1136970+08:00||;True|2025-05-06T09:05:16.4695917+08:00||;True|2025-04-22T15:43:19.8599243+08:00||;True|2025-04-03T14:51:22.5389895+08:00||;True|2025-04-03T13:39:16.2049845+08:00||;</History> <LastFailureDetails /> </PropertyGroup> </Project> Yw.WpfUI.Hydro.L3d.Core/Yw.WpfUI.Hydro.L3d.Core.csproj
@@ -7,7 +7,7 @@ <UseWPF>true</UseWPF> <ImplicitUsings>enable</ImplicitUsings> <GeneratePackageOnBuild>True</GeneratePackageOnBuild> <Version>1.1.1</Version> <Version>1.1.2</Version> </PropertyGroup> <ItemGroup>