添加项目文件。
This commit is contained in:
273
Mstn.Toolkit/External/UserPickTool.cs
vendored
Normal file
273
Mstn.Toolkit/External/UserPickTool.cs
vendored
Normal file
@@ -0,0 +1,273 @@
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user