namespace Yw.WpfUI.Hydro
|
{
|
/// <summary>
|
/// 抽象编辑管理器
|
/// </summary>
|
internal class LogicalEditManager : LogicalManager
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public LogicalEditManager(HelixViewport3D viewport) : base(viewport)
|
{
|
|
}
|
|
private eLogicalEditMode _logicalMode = eLogicalEditMode.None;//编辑模式
|
private LogicalVisual3D _addLogicalVisual;//添加抽象对象
|
private LogicalNode3D _editLogicalNode;//编辑抽象节点
|
|
|
#region 添加方法
|
|
/// <summary>
|
/// 开始添加连接节点
|
/// </summary>
|
public void StartAddJunction()
|
{
|
_logicalMode = eLogicalEditMode.AddJunction;
|
}
|
|
/// <summary>
|
/// 开始添加水库
|
/// </summary>
|
public void StartAddReservoir()
|
{
|
_logicalMode = eLogicalEditMode.AddReservoir;
|
}
|
|
/// <summary>
|
/// 开始添加水池
|
/// </summary>
|
public void StartAddTank()
|
{
|
_logicalMode = eLogicalEditMode.AddTank;
|
}
|
|
/// <summary>
|
/// 开始添加自由管道
|
/// </summary>
|
public void StartAddPipe()
|
{
|
_logicalMode = eLogicalEditMode.AddPipe;
|
}
|
|
/// <summary>
|
/// 开始添加水平管道
|
/// </summary>
|
public void StartAddHorizPipe()
|
{
|
_logicalMode = eLogicalEditMode.AddHorizPipe;
|
}
|
|
/// <summary>
|
/// 开始添加垂直管道
|
/// </summary>
|
public void StartAddVertPipe()
|
{
|
_logicalMode = eLogicalEditMode.AddVertPipe;
|
}
|
|
/// <summary>
|
/// 开始添加水泵
|
/// </summary>
|
public void StartAddPump()
|
{
|
_logicalMode = eLogicalEditMode.AddPump;
|
}
|
|
/// <summary>
|
/// 开始添加阀门
|
/// </summary>
|
public void StartAddValve()
|
{
|
_logicalMode = eLogicalEditMode.AddValve;
|
}
|
|
#endregion
|
|
#region 编辑方法
|
|
/// <summary>
|
/// 开始编辑
|
/// </summary>
|
public void StartEdit()
|
{
|
_logicalMode = eLogicalEditMode.Edit;
|
}
|
|
/// <summary>
|
/// 结束编辑
|
/// </summary>
|
public void EndEdit()
|
{
|
_logicalMode = eLogicalEditMode.None;
|
}
|
|
#endregion
|
|
#region 重写事件
|
|
//鼠标按下
|
protected override void OnMouseDown(MouseButtonEventArgs e)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
_addLogicalVisual = null;
|
switch (_logicalMode)
|
{
|
case eLogicalEditMode.AddJunction:
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
var junction = new JunctionL3d();
|
junction.Id = _nw.CreateId(CatalogL3d.Junction);
|
junction.Catalog = CatalogL3d.Junction;
|
junction.Name = _nw.CreateName(CatalogL3d.Junction);
|
junction.Position = sp.Value.ToPointL3d();
|
_stateHelper.LoadState(junction, eLogicalState.Adding);
|
var logicalJunction = CreateLogicalVisual(junction);
|
logicalJunction.UpdateVisual();
|
AddLogicalVisual(logicalJunction);
|
_addLogicalVisual = logicalJunction;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddReservoir:
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
var reservoir = new ReservoirL3d();
|
reservoir.Id = _nw.CreateId(CatalogL3d.Reservoir);
|
reservoir.Catalog = CatalogL3d.Reservoir;
|
reservoir.Name = _nw.CreateName(CatalogL3d.Reservoir);
|
reservoir.Position = sp.Value.ToPointL3d();
|
_stateHelper.LoadState(reservoir, eLogicalState.Adding);
|
var logicalReservoir = CreateLogicalVisual(reservoir);
|
logicalReservoir.UpdateVisual();
|
AddLogicalVisual(logicalReservoir);
|
_addLogicalVisual = logicalReservoir;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddTank:
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
var tank = new TankL3d();
|
tank.Id = _nw.CreateId(CatalogL3d.Tank);
|
tank.Catalog = CatalogL3d.Tank;
|
tank.Name = _nw.CreateName(CatalogL3d.Tank);
|
tank.Position = sp.Value.ToPointL3d();
|
_stateHelper.LoadState(tank, eLogicalState.Adding);
|
var logicalTank = CreateLogicalVisual(tank);
|
logicalTank.UpdateVisual();
|
AddLogicalVisual(logicalTank);
|
_addLogicalVisual = logicalTank;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddPipe:
|
{
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode != null)
|
{
|
var pipe = new PipeL3d();
|
pipe.Id = _nw.CreateId(CatalogL3d.Pipe);
|
pipe.Catalog = CatalogL3d.Pipe;
|
pipe.Name = _nw.CreateName(CatalogL3d.Pipe);
|
pipe.StartNode = logicalNode.Vmo;
|
_stateHelper.LoadState(pipe, eLogicalState.Adding);
|
var logicalPipe = CreateLogicalVisual(pipe) as LogicalPipe3D;
|
logicalPipe.EndPosition = logicalNode.Position;
|
logicalPipe.UpdateVisual();
|
AddLogicalVisual(logicalPipe);
|
_addLogicalVisual = logicalPipe;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddHorizPipe:
|
{
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode != null)
|
{
|
var pipe = new PipeL3d();
|
pipe.Id = _nw.CreateId(CatalogL3d.Pipe);
|
pipe.Catalog = CatalogL3d.Pipe;
|
pipe.Name = _nw.CreateName(CatalogL3d.Pipe);
|
pipe.StartNode = logicalNode.Vmo;
|
_stateHelper.LoadState(pipe, eLogicalState.Adding);
|
var logicalPipe = CreateLogicalVisual(pipe) as LogicalPipe3D;
|
logicalPipe.EndPosition = logicalNode.Position;
|
logicalPipe.UpdateVisual();
|
AddLogicalVisual(logicalPipe);
|
_addLogicalVisual = logicalPipe;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddVertPipe:
|
{
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode != null)
|
{
|
var pipe = new PipeL3d();
|
pipe.Id = _nw.CreateId(CatalogL3d.Pipe);
|
pipe.Catalog = CatalogL3d.Pipe;
|
pipe.Name = _nw.CreateName(CatalogL3d.Pipe);
|
pipe.StartNode = logicalNode.Vmo;
|
_stateHelper.LoadState(pipe, eLogicalState.Adding);
|
var logicalPipe = CreateLogicalVisual(pipe) as LogicalPipe3D;
|
logicalPipe.EndPosition = logicalNode.Position;
|
logicalPipe.UpdateVisual();
|
AddLogicalVisual(logicalPipe);
|
_addLogicalVisual = logicalPipe;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddPump:
|
{
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode != null)
|
{
|
var pump = new PumpL3d();
|
pump.Id = _nw.CreateId(CatalogL3d.Pump);
|
pump.Catalog = CatalogL3d.Pump;
|
pump.Name = _nw.CreateName(CatalogL3d.Pump);
|
pump.StartNode = logicalNode.Vmo;
|
_stateHelper.LoadState(pump, eLogicalState.Adding);
|
var logicalPump = CreateLogicalVisual(pump) as LogicalPump3D;
|
logicalPump.EndPosition = logicalNode.Position;
|
logicalPump.UpdateVisual();
|
AddLogicalVisual(logicalPump);
|
_addLogicalVisual = logicalPump;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddValve:
|
{
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode != null)
|
{
|
var valve = new ValveL3d();
|
valve.Id = _nw.CreateId(CatalogL3d.Valve);
|
valve.Catalog = CatalogL3d.Valve;
|
valve.Name = _nw.CreateName(CatalogL3d.Valve);
|
valve.StartNode = logicalNode.Vmo;
|
_stateHelper.LoadState(valve, eLogicalState.Adding);
|
var logicalValve = CreateLogicalVisual(valve) as LogicalValve3D;
|
logicalValve.EndPosition = logicalNode.Position;
|
logicalValve.UpdateVisual();
|
AddLogicalVisual(logicalValve);
|
_addLogicalVisual = logicalValve;
|
}
|
}
|
break;
|
case eLogicalEditMode.Edit:
|
{
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode != null)
|
{
|
var node = logicalNode.Vmo;
|
_stateHelper.LoadState(logicalNode.Vmo, eLogicalState.Editing);
|
_editLogicalNode = logicalNode;
|
}
|
}
|
break;
|
default:
|
{
|
base.OnMouseDown(e);
|
}
|
break;
|
}
|
}
|
|
//鼠标移动
|
protected override void OnMouseMove(MouseEventArgs e)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
|
switch (_logicalMode)
|
{
|
case eLogicalEditMode.AddJunction:
|
{
|
var logicalJunction = _addLogicalVisual as LogicalJunction3D;
|
if (logicalJunction != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
logicalJunction.Vmo.Position = sp.Value.ToPointL3d();
|
logicalJunction.UpdateVisual();
|
}
|
}
|
}
|
break;
|
case eLogicalEditMode.AddReservoir:
|
{
|
var logicalReservoir = _addLogicalVisual as LogicalSource3D;
|
if (logicalReservoir != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
logicalReservoir.Vmo.Position = sp.Value.ToPointL3d();
|
logicalReservoir.UpdateVisual();
|
}
|
}
|
}
|
break;
|
case eLogicalEditMode.AddTank:
|
{
|
var logicalTank = _addLogicalVisual as LogicalTank3D;
|
if (logicalTank != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
logicalTank.Vmo.Position = sp.Value.ToPointL3d();
|
logicalTank.UpdateVisual();
|
}
|
}
|
}
|
break;
|
case eLogicalEditMode.AddPipe:
|
{
|
base.OnMouseMove(e);
|
var logicalPipe = _addLogicalVisual as LogicalPipe3D;
|
if (logicalPipe != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
logicalPipe.EndPosition = sp.Value;
|
logicalPipe.UpdateVisual();
|
}
|
}
|
}
|
break;
|
case eLogicalEditMode.AddHorizPipe:
|
{
|
base.OnMouseMove(e);
|
var logicalPipe = _addLogicalVisual as LogicalPipe3D;
|
if (logicalPipe != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
logicalPipe.EndPosition = new Point3D(sp.Value.X, sp.Value.Y, logicalPipe.StartPosition.Z);
|
logicalPipe.UpdateVisual();
|
}
|
}
|
}
|
break;
|
case eLogicalEditMode.AddVertPipe:
|
{
|
base.OnMouseMove(e);
|
var logicalPipe = _addLogicalVisual as LogicalPipe3D;
|
if (logicalPipe != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
logicalPipe.EndPosition = new Point3D(logicalPipe.StartPosition.X, logicalPipe.StartPosition.Y, sp.Value.Z);
|
logicalPipe.UpdateVisual();
|
}
|
}
|
}
|
break;
|
case eLogicalEditMode.AddPump:
|
{
|
base.OnMouseMove(e);
|
var logicalPump = _addLogicalVisual as LogicalPump3D;
|
if (logicalPump != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
logicalPump.EndPosition = sp.Value;
|
logicalPump.UpdateVisual();
|
}
|
}
|
}
|
break;
|
case eLogicalEditMode.AddValve:
|
{
|
base.OnMouseMove(e);
|
var logicalValve = _addLogicalVisual as LogicalValve3D;
|
if (logicalValve != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
logicalValve.EndPosition = sp.Value;
|
logicalValve.UpdateVisual();
|
}
|
}
|
}
|
break;
|
case eLogicalEditMode.Edit:
|
{
|
base.OnMouseMove(e);
|
if (_editLogicalNode != null)
|
{
|
var pt = e.GetPosition(_viewport);
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
var node = _editLogicalNode.Vmo;
|
node.Position = sp.Value.ToPointL3d();
|
_editLogicalNode.UpdateVisual();
|
var links = _nw.Links.Where(x => x.StartNode == node || x.EndNode == node).ToList();
|
links?.ForEach(x => _allVisualLogicalDict[x].UpdateVisual());
|
}
|
}
|
}
|
break;
|
default:
|
{
|
base.OnMouseMove(e);
|
}
|
break;
|
}
|
}
|
|
//鼠标弹起
|
protected override void OnMouseUp(MouseButtonEventArgs e)
|
{
|
if (!Initialized)
|
{
|
return;
|
}
|
switch (_logicalMode)
|
{
|
case eLogicalEditMode.AddJunction:
|
{
|
var logicalJunction = _addLogicalVisual as LogicalJunction3D;
|
if (logicalJunction != null)
|
{
|
_stateHelper.UnloadState(logicalJunction.Vmo, eLogicalState.Adding);
|
if (!logicalJunction.Verify())
|
{
|
RemoveLogicalVisual(logicalJunction);
|
}
|
_addLogicalVisual = null;
|
_logicalMode = eLogicalEditMode.None;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddReservoir:
|
{
|
var logicalReservoir = _addLogicalVisual as LogicalReservoir3D;
|
if (logicalReservoir != null)
|
{
|
_stateHelper.UnloadState(logicalReservoir.Vmo, eLogicalState.Adding);
|
if (!logicalReservoir.Verify())
|
{
|
RemoveLogicalVisual(logicalReservoir);
|
}
|
_addLogicalVisual = null;
|
_logicalMode = eLogicalEditMode.None;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddTank:
|
{
|
var logicalTank = _addLogicalVisual as LogicalTank3D;
|
if (logicalTank != null)
|
{
|
_stateHelper.UnloadState(logicalTank.Vmo, eLogicalState.Adding);
|
if (!logicalTank.Verify())
|
{
|
RemoveLogicalVisual(logicalTank);
|
}
|
_addLogicalVisual = null;
|
_logicalMode = eLogicalEditMode.None;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddPipe:
|
{
|
var logicalPipe = _addLogicalVisual as LogicalPipe3D;
|
if (logicalPipe != null)
|
{
|
_stateHelper.UnloadState(logicalPipe.Vmo, eLogicalState.Adding);
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode == null)
|
{
|
var sp = _viewport.Viewport.UnProject(pt);
|
var junction = new JunctionL3d();
|
junction.Id = _nw.CreateId(CatalogL3d.Junction);
|
junction.Catalog = CatalogL3d.Junction;
|
junction.Name = _nw.CreateName(CatalogL3d.Junction);
|
junction.Position = sp.Value.ToPointL3d();
|
var logicalVisual = CreateLogicalVisual(junction);
|
AddLogicalVisual(logicalVisual);
|
logicalPipe.Vmo.EndNode = junction;
|
}
|
else
|
{
|
logicalPipe.Vmo.EndNode = logicalNode.Vmo;
|
}
|
logicalPipe.UpdateVisual();
|
if (!logicalPipe.Verify())
|
{
|
RemoveLogicalVisual(logicalPipe);
|
}
|
_addLogicalVisual = null;
|
_logicalMode = eLogicalEditMode.None;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddHorizPipe:
|
{
|
var logicalPipe = _addLogicalVisual as LogicalPipe3D;
|
if (logicalPipe != null)
|
{
|
_stateHelper.UnloadState(logicalPipe.Vmo, eLogicalState.Adding);
|
var end = logicalPipe.EndPosition;
|
var logicalNode = SnapNearestNode(end);
|
if (logicalNode == null)
|
{
|
var junction = new JunctionL3d();
|
junction.Id = _nw.CreateId(CatalogL3d.Junction);
|
junction.Catalog = CatalogL3d.Junction;
|
junction.Name = _nw.CreateName(CatalogL3d.Junction);
|
junction.Position = end.ToPointL3d();
|
var logicalJunction = CreateLogicalVisual(junction);
|
AddLogicalVisual(logicalJunction);
|
logicalPipe.Vmo.EndNode = junction;
|
}
|
else
|
{
|
logicalPipe.Vmo.EndNode = logicalNode.Vmo;
|
}
|
logicalPipe.UpdateVisual();
|
if (!logicalPipe.Verify())
|
{
|
RemoveLogicalVisual(logicalPipe);
|
}
|
_addLogicalVisual = null;
|
_logicalMode = eLogicalEditMode.None;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddVertPipe:
|
{
|
var logicalPipe = _addLogicalVisual as LogicalPipe3D;
|
if (logicalPipe != null)
|
{
|
_stateHelper.UnloadState(logicalPipe.Vmo, eLogicalState.Adding);
|
var end = logicalPipe.EndPosition;
|
var logicalNode = SnapNearestNode(end);
|
if (logicalNode == null)
|
{
|
var junction = new JunctionL3d();
|
junction.Id = _nw.CreateId(CatalogL3d.Junction);
|
junction.Catalog = CatalogL3d.Junction;
|
junction.Name = _nw.CreateName(CatalogL3d.Junction);
|
junction.Position = end.ToPointL3d();
|
var logicalJunction = CreateLogicalVisual(junction);
|
AddLogicalVisual(logicalJunction);
|
logicalPipe.Vmo.EndNode = junction;
|
}
|
else
|
{
|
logicalPipe.Vmo.EndNode = logicalNode.Vmo;
|
}
|
logicalPipe.UpdateVisual();
|
if (!logicalPipe.Verify())
|
{
|
RemoveLogicalVisual(logicalPipe);
|
}
|
_addLogicalVisual = null;
|
_logicalMode = eLogicalEditMode.None;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddPump:
|
{
|
var logicalPump = _addLogicalVisual as LogicalPump3D;
|
if (logicalPump != null)
|
{
|
_stateHelper.UnloadState(logicalPump.Vmo, eLogicalState.Adding);
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode == null)
|
{
|
var sp = _viewport.Viewport.UnProject(pt);
|
var junction = new JunctionL3d();
|
junction.Id = _nw.CreateId(CatalogL3d.Junction);
|
junction.Catalog = CatalogL3d.Junction;
|
junction.Name = _nw.CreateName(CatalogL3d.Junction);
|
junction.Position = sp.Value.ToPointL3d();
|
var logicalVisual = CreateLogicalVisual(junction);
|
AddLogicalVisual(logicalVisual);
|
logicalPump.Vmo.EndNode = junction;
|
}
|
else
|
{
|
logicalPump.Vmo.EndNode = logicalNode.Vmo;
|
}
|
logicalPump.UpdateVisual();
|
if (!logicalPump.Verify())
|
{
|
RemoveLogicalVisual(logicalPump);
|
}
|
_addLogicalVisual = null;
|
_logicalMode = eLogicalEditMode.None;
|
}
|
}
|
break;
|
case eLogicalEditMode.AddValve:
|
{
|
var logicalValve = _addLogicalVisual as LogicalValve3D;
|
if (logicalValve != null)
|
{
|
_stateHelper.UnloadState(logicalValve.Vmo, eLogicalState.Adding);
|
var pt = e.GetPosition(_viewport);
|
var logicalNode = SnapNearestNode(pt);
|
if (logicalNode == null)
|
{
|
var sp = _viewport.Viewport.UnProject(pt);
|
var junction = new JunctionL3d();
|
junction.Id = _nw.CreateId(CatalogL3d.Junction);
|
junction.Catalog = CatalogL3d.Junction;
|
junction.Name = _nw.CreateName(CatalogL3d.Junction);
|
junction.Position = sp.Value.ToPointL3d();
|
var logicalVisual = CreateLogicalVisual(junction);
|
AddLogicalVisual(logicalVisual);
|
logicalValve.Vmo.EndNode = junction;
|
}
|
else
|
{
|
logicalValve.Vmo.EndNode = logicalNode.Vmo;
|
}
|
logicalValve.UpdateVisual();
|
if (!logicalValve.Verify())
|
{
|
RemoveLogicalVisual(logicalValve);
|
}
|
_addLogicalVisual = null;
|
_logicalMode = eLogicalEditMode.None;
|
}
|
}
|
break;
|
case eLogicalEditMode.Edit:
|
{
|
if (_editLogicalNode != null)
|
{
|
_stateHelper.UnloadState(_editLogicalNode.Vmo, eLogicalState.Editing);
|
}
|
_editLogicalNode = null;
|
}
|
break;
|
default:
|
{
|
base.OnMouseUp(e);
|
}
|
break;
|
}
|
}
|
|
#endregion
|
|
#region 构件方法
|
|
//创建抽象可见元素
|
private LogicalVisual3D CreateLogicalVisual(VisualL3d visual)
|
{
|
var logicalVisual = LogicalCreateHelper.Create(visual, _stateHelper, _materialHelper, _overrideColorHelper, _overrideOpacityHelper, _overrideVisibleHelper);
|
return logicalVisual;
|
}
|
|
//添加抽象可见元素
|
private void AddLogicalVisual(LogicalVisual3D 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(LogicalVisual3D 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
|
|
#region 辅助方法
|
|
//吸附最近节点
|
private LogicalNode3D SnapNearestNode(Point pt)
|
{
|
if (!Initialized)
|
{
|
return default;
|
}
|
var logicalNode = _viewport.FindNearestVisual(pt) as LogicalNode3D;
|
if (logicalNode == null)
|
{
|
var sp = _viewport.Viewport.UnProject(pt);
|
if (sp.HasValue)
|
{
|
var snapDistance = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.SnapDistance;
|
logicalNode = _viewport.Children.OfType<LogicalNode3D>()
|
.OrderBy(x => (x.Position - sp.Value).LengthSquared)
|
.FirstOrDefault(x => (x.Position - sp.Value).Length < snapDistance);
|
}
|
|
}
|
|
return logicalNode;
|
}
|
|
//吸附最近节点
|
private LogicalNode3D SnapNearestNode(Point3D pt)
|
{
|
if (!Initialized)
|
{
|
return default;
|
}
|
var snapDistance = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.SnapDistance;
|
var logicalNode = _viewport.Children.OfType<LogicalNode3D>()
|
.OrderBy(x => (x.Position - pt).LengthSquared)
|
.FirstOrDefault(x => (x.Position - pt).Length < snapDistance);
|
|
return logicalNode;
|
}
|
|
#endregion
|
|
|
}
|
}
|