MLJ666 2019-07-09 21:20 采纳率: 0%
浏览 845
已结题

Revit非模态窗口的运用

Revit非模态窗口的运用

求教,我想制作类似红瓦一键翻弯的非模态窗体,选择目标管道后按下右键立刻执行翻弯的代码。
我自己写了的代码参考了网上黑夜の骑士老师的博客,想实现按下空格就执行管道翻弯的代码。但是我的写法,比如我想选择两个管道,然后按下空格,但是其实已经进入了第三次循环,必须选择第三根管道才能进入我想要执行的代码里。这样就多了一次没有意义的选择动作。求教怎样才能实现按下空格就执行目标代码,谢谢各位大神!

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(), "请选择需要打断的管道");
                }
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-07-09 22:13
    关注

    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";
    }
    }

    }

    评论

报告相同问题?

悬赏问题

  • ¥15 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!