namespace Yw.WpfUI.Hydro
|
{
|
/// <summary>
|
/// 绘制初始化辅助类
|
/// </summary>
|
internal class DrawInitialHelper
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public DrawInitialHelper(HelixViewport3D viewport)
|
{
|
_viewport = viewport;
|
}
|
|
#region 事件集合
|
|
/// <summary>
|
/// 初始化完成事件
|
/// </summary>
|
public event Action InitialCompletedEvent;
|
/// <summary>
|
/// 背景改变事件
|
/// </summary>
|
public event Action<BackgroundL3d> BackgroundChangedEvent;
|
/// <summary>
|
/// 工作面板改变事件
|
/// </summary>
|
public event Action<WorkPanelL3d> WorkPanelChangedEvent;
|
|
#endregion
|
|
private readonly HelixViewport3D _viewport = null;//三维组件
|
private NetworkL3d _nw = null;//管网
|
private Dictionary<string, VisualL3d> _allVisualDict = null;//所有可视化对象字典
|
private Dictionary<VisualL3d, VisualDraw3D> _allVisual3dDict = null;//所有可视化3d对象字典
|
|
/// <summary>
|
/// 是否初始化
|
/// </summary>
|
public bool Initialized
|
{
|
get
|
{
|
if (_nw == null)
|
{
|
return false;
|
}
|
if (_allVisualDict == null)
|
{
|
return false;
|
}
|
if (_allVisual3dDict == null)
|
{
|
return false;
|
}
|
return true;
|
}
|
}
|
|
/// <summary>
|
/// 管网
|
/// </summary>
|
public NetworkL3d Network
|
{
|
get
|
{
|
return _nw;
|
}
|
}
|
|
/// <summary>
|
/// 初始化
|
/// </summary>
|
public void Initial(NetworkL3d nw)
|
{
|
_nw = nw;
|
if (_nw == null)
|
{
|
_nw = new NetworkL3d();
|
}
|
InitialWorkPanel();
|
InitialBackground();
|
InitialCameraController();
|
_allVisualDict = new Dictionary<string, VisualL3d>();
|
_allVisual3dDict = new Dictionary<VisualL3d, VisualDraw3D>();
|
foreach (var visual in _nw.Visuals)
|
{
|
_allVisualDict.Add(visual.Id, visual);
|
var visual3d = DrawCreateHelper.Create(visual, _nw.DrawMode);
|
if (visual3d != null)
|
{
|
visual3d.UpdateVisual3D();
|
_allVisual3dDict.Add(visual, visual3d);
|
}
|
}
|
_viewport.Children.Clear();
|
_viewport.Children.Add(new SunLight());
|
_allVisual3dDict.Values.ToList().ForEach(x => _viewport.Children.Add(x));
|
this.InitialCompletedEvent?.Invoke();
|
}
|
|
#region 构件操作
|
|
/// <summary>
|
/// 获取Visual3D
|
/// </summary>
|
public VisualDraw3D GetVisual3D(string Id)
|
{
|
if (!Initialized)
|
{
|
return default;
|
}
|
var id = Id?.Trim();
|
if (string.IsNullOrEmpty(id))
|
{
|
return default;
|
}
|
if (_allVisualDict.ContainsKey(id))
|
{
|
var visual = _allVisualDict[Id];
|
if (_allVisual3dDict.ContainsKey(visual))
|
{
|
var visual3d = _allVisual3dDict[visual];
|
return visual3d;
|
}
|
}
|
return default;
|
}
|
|
/// <summary>
|
/// 获取Visual3D
|
/// </summary>
|
public List<VisualDraw3D> GetVisual3D(List<string> Ids)
|
{
|
if (!Initialized)
|
{
|
return default;
|
}
|
var list = Ids?.Select(x => GetVisual3D(x)).Where(x => x != null).ToList();
|
return list;
|
}
|
|
/// <summary>
|
/// 添加Visual3D
|
/// </summary>
|
public bool AddVisual3D(VisualDraw3D visual3d)
|
{
|
if (!Initialized)
|
{
|
return false;
|
}
|
if (visual3d == null)
|
{
|
return false;
|
}
|
var visual = visual3d.Visual;
|
if (_nw.IsExist(visual.Id))
|
{
|
return false;
|
}
|
var bol = _nw.Append(visual, out _);
|
if (!bol)
|
{
|
return bol;
|
}
|
if (!_allVisualDict.ContainsKey(visual.Id))
|
{
|
_allVisualDict.Add(visual.Id, visual);
|
}
|
if (!_allVisual3dDict.ContainsKey(visual))
|
{
|
_allVisual3dDict.Add(visual, visual3d);
|
}
|
if (!_viewport.Children.Contains(visual3d))
|
{
|
_viewport.Children.Add(visual3d);
|
}
|
return true;
|
}
|
|
/// <summary>
|
/// 移除Visual3D
|
/// </summary>
|
public bool RemoveVisual3D(VisualDraw3D visual3d)
|
{
|
if (!Initialized)
|
{
|
return false;
|
}
|
if (visual3d == null)
|
{
|
return false;
|
}
|
var visual = visual3d.Visual;
|
if (_nw.IsExist(visual))
|
{
|
_nw.Remove(visual);
|
}
|
if (_allVisualDict.ContainsKey(visual.Id))
|
{
|
_allVisualDict.Remove(visual.Id);
|
}
|
if (_allVisual3dDict.ContainsKey(visual))
|
{
|
_allVisual3dDict.Remove(visual);
|
}
|
if (_viewport.Children.Contains(visual3d))
|
{
|
_viewport.Children.Remove(visual3d);
|
}
|
return true;
|
}
|
|
#endregion
|
|
#region 创建辅助
|
|
/// <summary>
|
/// 创建Id
|
/// </summary>
|
public string CreateId(string catalog)
|
{
|
if (!Initialized)
|
{
|
return string.Empty;
|
}
|
return _nw.CreateId(catalog);
|
}
|
|
/// <summary>
|
/// 创建名称
|
/// </summary>
|
public string CreateName(string catalog)
|
{
|
if (!Initialized)
|
{
|
return string.Empty;
|
}
|
return _nw.CreateName(catalog);
|
}
|
|
#endregion
|
|
#region 图片背景
|
|
/// <summary>
|
/// 初始化背景
|
/// </summary>
|
public void InitialBackground()
|
{
|
if (_nw == null)
|
{
|
return;
|
}
|
if (_nw.Background == null)
|
{
|
var paras = Yw.Settings.HydroL3dParasHelper.HydroL3d.Background;
|
_nw.Background = new BackgroundL3d();
|
_nw.Background.Origin = new PointL3d(paras.Origin.X, paras.Origin.Y, paras.Origin.Z);
|
_nw.Background.Normal = new PointL3d(paras.Normal.X, paras.Normal.Y, paras.Normal.Z);
|
_nw.Background.Scale = paras.Scale;
|
}
|
}
|
|
/// <summary>
|
/// 获取背景
|
/// </summary>
|
public BackgroundL3d GetBackground()
|
{
|
if (!Initialized)
|
{
|
return default;
|
}
|
InitialBackground();
|
return _nw.Background;
|
}
|
|
/// <summary>
|
/// 设置背景
|
/// </summary>
|
public void SetBackground(BackgroundL3d background)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
if (background == null)
|
{
|
return;
|
}
|
_nw.Background = background;
|
this.BackgroundChangedEvent?.Invoke(background);
|
}
|
|
/// <summary>
|
/// 设置背景
|
/// </summary>
|
public void SetBackground(string url)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
if (string.IsNullOrEmpty(url))
|
{
|
return;
|
}
|
// 处理相对路径(相对于应用程序执行目录)
|
string fullPath = Path.GetFullPath(url);
|
|
// 检查文件是否存在
|
if (!File.Exists(fullPath))
|
{
|
return;
|
}
|
InitialBackground();
|
_nw.Background.Url = url;
|
this.BackgroundChangedEvent?.Invoke(_nw.Background);
|
}
|
|
|
#endregion
|
|
#region 工作面板
|
|
/// <summary>
|
/// 初始化工作面板
|
/// </summary>
|
public void InitialWorkPanel()
|
{
|
if (_nw == null)
|
{
|
return;
|
}
|
if (_nw.WorkPanel == null)
|
{
|
var paras = Yw.Settings.HydroL3dParasHelper.HydroL3d.WorkPanel;
|
_nw.WorkPanel = new WorkPanelL3d();
|
_nw.WorkPanel.Width = paras.Width;
|
_nw.WorkPanel.Length = paras.Length;
|
_nw.WorkPanel.Center = new PointL3d(paras.Center.X, paras.Center.Y, paras.Center.Z);
|
_nw.WorkPanel.Normal = new PointL3d(paras.Normal.X, paras.Normal.Y, paras.Normal.Z);
|
_nw.WorkPanel.MajorDistance = paras.MajorDistance;
|
_nw.WorkPanel.MinorDistance = paras.MinorDistance;
|
_nw.WorkPanel.Thickness = paras.Thickness;
|
_nw.WorkPanel.HtmlColor = paras.HtmlColor;
|
}
|
}
|
|
/// <summary>
|
/// 获取工作面板
|
/// </summary>
|
public WorkPanelL3d GetWorkPanel()
|
{
|
if (!Initialized)
|
{
|
return default;
|
}
|
InitialWorkPanel();
|
return _nw.WorkPanel;
|
}
|
|
/// <summary>
|
/// 设置工作面板
|
/// </summary>
|
public void SetWorkPanel(WorkPanelL3d workPanel)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
if (workPanel == null)
|
{
|
return;
|
}
|
_nw.WorkPanel = workPanel;
|
this.WorkPanelChangedEvent?.Invoke(workPanel);
|
}
|
|
#endregion
|
|
#region 相机控制
|
|
/// <summary>
|
/// 初始化相机控制器
|
/// </summary>
|
public void InitialCameraController()
|
{
|
if (_nw == null)
|
{
|
return;
|
}
|
if (_nw.CameraController == null)
|
{
|
_nw.CameraController = new CameraControllerL3d();
|
}
|
if (_nw.CameraController.DefaultCamera == null)
|
{
|
_nw.CameraController.DefaultCamera = new CameraInfoL3d() { Name = "默认" };
|
}
|
}
|
|
/// <summary>
|
/// 获取默认相机设置
|
/// </summary>
|
public CameraSettingL3d GetDefaultCameraSetting()
|
{
|
if (!Initialized)
|
{
|
return default;
|
}
|
InitialCameraController();
|
return _nw.CameraController.DefaultCamera.Camera;
|
}
|
|
/// <summary>
|
/// 设置默认相机设置
|
/// </summary>
|
public void SetDefaultCameraSetting(CameraSettingL3d cs)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
if (cs == null)
|
{
|
return;
|
}
|
InitialCameraController();
|
_nw.CameraController.DefaultCamera.Camera = cs;
|
}
|
|
/// <summary>
|
/// 设置默认相机名称
|
/// </summary>
|
public void SetDefaultCameraName(string name)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
if (string.IsNullOrEmpty(name))
|
{
|
return;
|
}
|
InitialCameraController();
|
_nw.CameraController.DefaultCamera.Name = name;
|
}
|
|
#endregion
|
|
|
}
|
}
|