125 lines
4.7 KiB
C#
125 lines
4.7 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
|
||
using Bentley.DgnPlatformNET;
|
||
using Bentley.DgnPlatformNET.Elements;
|
||
using Bentley.GeometryNET;
|
||
using Bentley.MstnPlatformNET;
|
||
|
||
namespace Mstn.Toolkit.External
|
||
{
|
||
public class DynamicDrawTool : DgnElementSetTool
|
||
{
|
||
private List<DPoint3d> m_pos;
|
||
private string startPrompt;
|
||
private string updatePrompt;
|
||
private Func<List<DPoint3d>, DPoint3d, Element> creation;
|
||
private int pickTimes;
|
||
|
||
private DynamicDrawTool(int toolId, int prompt) : base(toolId, prompt)
|
||
{
|
||
|
||
}
|
||
/// <summary>
|
||
/// 交互式工具的入口函数,用于声明工具并进行加载
|
||
/// </summary>
|
||
/// <param name="creation">元素创建的条件及创建元素的对象</param>
|
||
/// <param name="pickTimes">选取次数</param>
|
||
/// <param name="startPrompt"></param>
|
||
/// <param name="updatePrompt"></param>
|
||
public static void Setup(Func<List<DPoint3d>, DPoint3d, Element> creation, int pickTimes, string startPrompt, string updatePrompt)
|
||
{
|
||
DynamicDrawTool primitiveTool = new(0, 0)
|
||
{
|
||
startPrompt = startPrompt,
|
||
updatePrompt = updatePrompt,
|
||
pickTimes = pickTimes,
|
||
creation = creation
|
||
};
|
||
primitiveTool.InstallTool();//加载工具
|
||
}
|
||
|
||
protected override void OnPostInstall()//工具激活后执行
|
||
{
|
||
NotificationManager.OutputPrompt(startPrompt);//将提示语输出到提示框中
|
||
|
||
m_pos = [];//创建用于储存坐标的列表
|
||
}
|
||
|
||
/*
|
||
* 如果我们对通过参数传递进来的元素进行修改,并且返回SUCCESS的话,在_DoOperationForModify
|
||
* 中会用修改后的元素替换掉原来的元素,当然前提是_IsModifyOriginal返回true。否则的话会直接
|
||
* 把修改后的元素重新添加到Dgn文件中。
|
||
*/
|
||
public override StatusInt OnElementModify(Element element)
|
||
{
|
||
return StatusInt.Error;
|
||
}
|
||
|
||
protected override bool OnDataButton(DgnButtonEvent ev)//点击确认键(默认为左键)后触发
|
||
{
|
||
NotificationManager.OutputPrompt(updatePrompt);//将提示语输出到提示框中
|
||
if (m_pos.Count() == 0)
|
||
{
|
||
BeginDynamics();//启动动态绘制,只启动一次
|
||
}
|
||
m_pos.Add(ev.Point);//添加捕捉点
|
||
|
||
if (pickTimes == m_pos.Count)
|
||
{
|
||
EndDynamics();//关闭动态绘制
|
||
m_pos.Add(ev.Point);//添加捕捉点
|
||
Element element = creation(m_pos, ev.Point);
|
||
element.AddToModel();//将椭圆元素写入模型
|
||
m_pos.Clear();//清空列表
|
||
|
||
NotificationManager.OutputPrompt(startPrompt);//将提示语输出到提示框中
|
||
}
|
||
return true;
|
||
}
|
||
/// <summary>
|
||
/// BeginDynamics后动态绘制时触发
|
||
/// </summary>
|
||
/// <param name="ev"></param>
|
||
protected override void OnDynamicFrame(DgnButtonEvent ev)
|
||
{
|
||
//每次增加一个点的时候,生成元素的操作都要更新,根据点数来确定生成元素的类型,不断在基础上叠加
|
||
Element element = creation(m_pos, ev.Point);
|
||
if (null == element)//若未成功生成椭圆元素
|
||
return;//返回
|
||
|
||
RedrawElems redrawElems = new()
|
||
{
|
||
DrawMode = DgnDrawMode.TempDraw,//设置绘制模式
|
||
DrawPurpose = DrawPurpose.Dynamics//设置绘制目标
|
||
};//使用元素用于动态绘制
|
||
redrawElems.SetDynamicsViewsFromActiveViewSet(Session.GetActiveViewport());//设置视角
|
||
redrawElems.DoRedraw(element);//使用元素用于动态绘制
|
||
}
|
||
|
||
protected override bool OnResetButton(DgnButtonEvent ev)//点击重置键(默认为右键)触发
|
||
{
|
||
if (m_pos.Count() == 0)//判断列表中点个数,若列表中没有坐标点则退出
|
||
{
|
||
ExitTool();//退出工具
|
||
}
|
||
else
|
||
{
|
||
EndDynamics();//停止动态捕捉
|
||
m_pos.Clear();//清空列表中的数据
|
||
|
||
NotificationManager.OutputPrompt(startPrompt);//将提示语输出到提示框中
|
||
}
|
||
return true;//返回
|
||
}
|
||
|
||
protected override void OnRestartTool()//重启工具时触发
|
||
{
|
||
Setup(creation, pickTimes, startPrompt, updatePrompt);//重新启动交互式工具
|
||
}
|
||
|
||
|
||
}
|
||
}
|