Files
MsAddIns/Mstn.Toolkit/External/DynamicDrawTool.cs
2026-02-28 21:01:57 +08:00

125 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);//重新启动交互式工具
}
}
}