274 lines
9.3 KiB
C#
274 lines
9.3 KiB
C#
using System;
|
||
|
||
using Bentley.DgnPlatformNET;
|
||
using Bentley.DgnPlatformNET.Elements;
|
||
|
||
using static Bentley.DgnPlatformNET.DgnElementSetTool;
|
||
|
||
namespace Mstn.Toolkit.External
|
||
{
|
||
|
||
public class UserPickTool : DgnElementSetTool
|
||
{
|
||
private Func<Element, bool> allowElement;
|
||
private string prompt;
|
||
private Action<ElementAgenda> operations;
|
||
private UserPickTool(int toolId, int promptId) : base(toolId, promptId)
|
||
{
|
||
}
|
||
public static void Setup(Func<Element, bool> allowElement, Action<ElementAgenda> operations, string prompt = "请选择元素")
|
||
{
|
||
UserPickTool tool = new(0, 0)
|
||
{
|
||
prompt = prompt,
|
||
allowElement = allowElement,
|
||
operations = operations,
|
||
};
|
||
|
||
tool.InstallTool();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判断是否要启用框选或者划选
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected override UsesDragSelect AllowDragSelect()
|
||
{
|
||
return UsesDragSelect.Box;
|
||
}
|
||
|
||
///// <summary>
|
||
///// 筛选拾取的元素
|
||
///// </summary>
|
||
///// <returns></returns>
|
||
//protected override bool FilterAgendaEntries()
|
||
//{
|
||
// for (uint i = 0; i < ElementAgenda.GetCount(); i++)
|
||
// {
|
||
// var elem = ElementAgenda.GetEntry(i);
|
||
// return allowElement(elem);
|
||
// }
|
||
// return false;
|
||
// //return base.FilterAgendaEntries();
|
||
//}
|
||
///// <summary>
|
||
///// 通过点选、围栅还是选择集来填充ElementAgenda
|
||
///// </summary>
|
||
///// <returns></returns>
|
||
//protected override ElementSource GetElementSource()
|
||
//{
|
||
// return base.GetElementSource();
|
||
//}
|
||
/// <summary>
|
||
/// 获取偏好选择方式
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected override ElementSource GetPreferredElementSource()
|
||
{
|
||
switch (AllowFence())
|
||
{
|
||
case UsesFence.Check:
|
||
if (UseActiveFence() && FenceManager.IsFenceActive)
|
||
{
|
||
return ElementSource.Fence;
|
||
}
|
||
break;
|
||
case UsesFence.Required:
|
||
return ElementSource.Fence;
|
||
case UsesFence.None:
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
switch (AllowSelection())
|
||
{
|
||
case UsesSelection.Check:
|
||
if (SelectionSetManager.IsActive())
|
||
{
|
||
return ElementSource.SelectionSet;
|
||
}
|
||
break;
|
||
case UsesSelection.Required:
|
||
return ElementSource.SelectionSet;
|
||
case UsesSelection.None:
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
return ElementSource.Pick;
|
||
}
|
||
/// <summary>
|
||
/// 判断是否需要用户再点击左键才开始处理元素
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
protected override bool NeedAcceptPoint()
|
||
{
|
||
return false;
|
||
}
|
||
///// <summary>
|
||
/////
|
||
///// </summary>
|
||
///// <param name="ev"></param>
|
||
///// <param name="newSearch">是否重新搜索</param>
|
||
///// <remarks>newSearch=false:表明用户最后拾取的元素不是想要的,调用RemoveAgendaElement移除,并继续往后定位其他元素</remarks>
|
||
//protected override void LocateOneElement(DgnButtonEvent ev, bool newSearch)
|
||
//{
|
||
// base.LocateOneElement(ev, newSearch);
|
||
//}
|
||
///// <summary>
|
||
///// 对ElementAgenda中的元素进行修改筛选
|
||
///// </summary>
|
||
//protected override void ModifyAgendaEntries()
|
||
//{
|
||
// base.ModifyAgendaEntries();
|
||
//}
|
||
///// <summary>
|
||
///// 点击确认键(默认为左键)后触发,判断是否需要拾取元素
|
||
///// </summary>
|
||
///// <param name="ev"></param>
|
||
///// <returns></returns>
|
||
//protected override bool OnDataButton(DgnButtonEvent ev)//
|
||
//{
|
||
// //var promptId = "OnDataButton";
|
||
|
||
// NotificationManager.OutputPrompt(prompt);//将提示语输出到提示框中
|
||
// if (ElementSource.Pick == GetElementSource())
|
||
// {
|
||
// //光标变为点选状态
|
||
// BeginPickElements();
|
||
// }
|
||
// else if (ElementSource.SelectionSet == GetElementSource())
|
||
// {
|
||
// //是否需要用户输入额外的确认点才开始处理选择集元素/判断是否需要用户再点击左键才开始处理元素
|
||
// if (NeedPointForSelection())
|
||
// {
|
||
|
||
// }
|
||
// else
|
||
// {
|
||
// BuildAgenda(ev);
|
||
// ProcessAgenda(ev);
|
||
// OnModifyComplete(ev);
|
||
// }
|
||
// if (!NeedPointForDynamics())
|
||
// {
|
||
// if (ElementSource.Pick != GetElementSource())
|
||
// {
|
||
// BuildAgenda(ev);
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
// return true;
|
||
//}
|
||
/// <summary>
|
||
/// 修改完毕,对选择集中的元素进行处理
|
||
/// </summary>
|
||
/// <param name="ev"></param>
|
||
/// <returns></returns>
|
||
protected override bool OnModifyComplete(DgnButtonEvent ev)
|
||
{
|
||
operations(ElementAgenda);
|
||
//for (uint i = 0; i < ElementAgenda.GetCount(); i++)
|
||
//{
|
||
// var elem = ElementAgenda.GetEntry(i);
|
||
// operation(elem);
|
||
//}
|
||
NotificationManager.OutputPrompt("完成");//将提示语输出到提示框中
|
||
return base.OnModifyComplete(ev);
|
||
}
|
||
/// <summary>
|
||
/// 工具激活后执行
|
||
/// </summary>
|
||
protected override void OnPostInstall()
|
||
{
|
||
//var promptId = "OnPostInstall";
|
||
//NotificationManager.OutputPrompt(promptId);//将提示语输出到提示框中
|
||
NotificationManager.OutputPrompt(prompt);
|
||
//var dgnModel = Session.Instance.GetActiveDgnModel();//获得当前的模型空间
|
||
base.OnPostInstall();
|
||
}
|
||
/// <summary>
|
||
/// 光标定位到某个元素时调用,判断是否支持该元素,能否被选中
|
||
/// </summary>
|
||
/// <param name="path"></param>
|
||
/// <param name="cantAcceptReason">光标在上方时,进行提醒,为什么不能被选中</param>
|
||
/// <returns></returns>
|
||
protected override bool OnPostLocate(HitPath path, out string cantAcceptReason)
|
||
{
|
||
var elem = path.GetCursorElement();
|
||
var b = allowElement(elem);
|
||
cantAcceptReason = b ? path.GetCursorElement().Description : "元素不适用此功能";
|
||
return b;
|
||
}
|
||
/// <summary>
|
||
/// 点击重置键(默认为右键)触发
|
||
/// </summary>
|
||
/// <param name="ev"></param>
|
||
/// <returns></returns>
|
||
|
||
protected override bool OnResetButton(DgnButtonEvent ev)//
|
||
{
|
||
ExitTool();//退出工具
|
||
return true;//返回
|
||
}
|
||
///// <summary>
|
||
///// 重启工具时触发
|
||
///// </summary>
|
||
protected override void OnRestartTool()
|
||
{
|
||
Setup(allowElement, operations, prompt);
|
||
}
|
||
///// <summary>
|
||
///// 设置选择方式
|
||
///// </summary>
|
||
///// <param name="source"></param>
|
||
//protected override void SetElementSource(ElementSource source)
|
||
//{
|
||
// switch (source)
|
||
// {
|
||
// case ElementSource.Pick:
|
||
// break;
|
||
// case ElementSource.Fence:
|
||
// break;
|
||
// case ElementSource.SelectionSet:
|
||
// break;
|
||
// default:
|
||
// break;
|
||
// }
|
||
//}
|
||
/// <summary>
|
||
/// 是否需要继续进行选择
|
||
/// </summary>
|
||
/// <param name="ev"></param>
|
||
/// <returns></returns>
|
||
protected override bool WantAdditionalLocate(DgnButtonEvent ev)
|
||
{
|
||
if (ev == null)//若没有选择到元素
|
||
{
|
||
return true;
|
||
}
|
||
if (ev.IsControlKey)//若检测到按动Ctrl行为
|
||
{
|
||
return true;
|
||
}
|
||
if (ElementAgenda.GetCount() == 0)//若选择集中没有元素
|
||
{
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/*
|
||
* 如果我们对通过参数传递进来的元素进行修改,并且返回SUCCESS的话,在_DoOperationForModify
|
||
* 中会用修改后的元素替换掉原来的元素,当然前提是_IsModifyOriginal返回true。否则的话会直接
|
||
* 把修改后的元素重新添加到Dgn文件中。
|
||
*/
|
||
public override StatusInt OnElementModify(Element element)
|
||
{
|
||
return StatusInt.Error;
|
||
}
|
||
|
||
}
|
||
}
|