求教,我想制作类似红瓦一键翻弯的非模态窗体,选择目标管道后按下右键立刻执行翻弯的代码。
我自己写了的代码参考了网上黑夜の骑士老师的博客,想实现按下空格就执行管道翻弯的代码。但是我的写法,比如我想选择两个管道,然后按下空格,但是其实已经进入了第三次循环,必须选择第三根管道才能进入我想要执行的代码里。这样就多了一次没有意义的选择动作。求教怎样才能实现按下空格就执行目标代码,谢谢各位大神!
while (true)
{
if (over) //如果检测到了按下空格键位,则over为True, 则执行整个里面的代码
{
//...测试
TaskDialog.Show("ss", "333");
stopListen();//停止监听
return Result.Succeeded;//程序运行监听里面的内容
//return Result.Cancelled; //当前程序停止运行
}
Reference reference = uidoc.Selection.PickObject(ObjectType.Element, new ObjectSelectionFilter(), "请选择需要打断的管道");
}
Revit从2013版之后就不允许在外部窗体下直接开启事务,当然我们可以使用模态窗体阻止线程的运行,其实说白了窗体不就是用户与程序的交互界面么,在窗体上设置好数据然后传递给主程序么,但是我们需要更强的数据交互功能,或者连续的命令调用。那么这个时候模态窗体就显得非常笨拙了,好在RevitAPI给我们提供了两个外部事件,一个是Idling,一个是ExternalEvent,那么上篇我们已经讲过Idling事件了,这里就不在赘述了,接下来我们使用ExternalEvent实现非模态窗体命令,其实很简单哦!——兵者,诡道也!故能而示之不能,用而示之不用,近而示之远,远而示之近。所以不要怕问题,大不了兵来将挡,水来土掩而已!
类代码
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.UI.Events;
namespace HelloWorld
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class Test : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Document Doc = uiDoc.Document;
Form1 frm = new Form1();
frm.Show();
return Result.Succeeded;
}
}
}
窗体代码
using System.Windows.Forms;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
namespace HelloWorld
{
public partial class Form1 : System.Windows.Forms.Form
{
ExecuteEvent Exc = null;
ExternalEvent eventHandler = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Exc = new ExecuteEvent();
eventHandler = ExternalEvent.Create(Exc);
}
private void button1_Click(object sender, EventArgs e)
{
eventHandler.Raise();
}
}
//新建一个类 继承 IExternalEventHandler接口
public class ExecuteEvent : IExternalEventHandler
{
public void Execute(UIApplication app)
{
Document doc = app.ActiveUIDocument.Document;
UIDocument uidoc = app.ActiveUIDocument;
Reference refer = uidoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "");
Transaction ts = new Transaction(doc,"BIM");
ts.Start();
Element elem = doc.GetElement(refer);
doc.Delete(elem.Id);
ts.Commit();
}
//估计是记录外部事件名称的 和事务名称相同
public string GetName()
{
return "this is a Test";
}
}
}