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 m_pos; private string startPrompt; private string updatePrompt; private Func, DPoint3d, Element> creation; private int pickTimes; private DynamicDrawTool(int toolId, int prompt) : base(toolId, prompt) { } /// /// 交互式工具的入口函数,用于声明工具并进行加载 /// /// 元素创建的条件及创建元素的对象 /// 选取次数 /// /// public static void Setup(Func, 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; } /// /// BeginDynamics后动态绘制时触发 /// /// 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);//重新启动交互式工具 } } }