Files
MsAddIns/Mstn.Toolkit/External/DynamicDrawTool.cs

125 lines
4.7 KiB
C#
Raw Permalink Normal View History

2026-02-28 21:01:57 +08:00
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);//重新启动交互式工具
}
}
}