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);//重新启动交互式工具
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|