非模态窗口有一个好处,就是可以一直停留在程序之前,然后持续完成操作。但是在Revit二次开发中,非模态窗口也有几个注意事项。

1、需要在文档关闭的时候,把非模态窗口也关闭掉,不然会导致文档关闭,窗口还在这样奇怪的Bug。

2、非模态的窗口的事件需要在IExternalCommand里注册。

3、每个操作必须在外部事件里进行。

以下代码关注后两个注意事项,第一个用上Document事件即可解决。

首先在IExternalCommand注册事件。

public class Command : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
try
{
ExecuteEventHandler executeEventHandler = new ExecuteEventHandler("Creat Model Line");
ExternalEvent externalEvent = ExternalEvent.Create(executeEventHandler);
// show UI
ModelessView modelessView = new ModelessView(executeEventHandler, externalEvent); //窗口一直显示在主程序之前
System.Windows.Interop.WindowInteropHelper mainUI = new System.Windows.Interop.WindowInteropHelper(modelessView);
mainUI.Owner = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
modelessView.Show(); return Autodesk.Revit.UI.Result.Succeeded;
}
catch (Exception e)
{
message = e.Message;
return Autodesk.Revit.UI.Result.Failed;
}
}
}

然后写一个通用的外部事件。

public class ExecuteEventHandler : IExternalEventHandler
{
public string Name { get;private set; } public Action<UIApplication> ExecuteAction { get; set; } public ExecuteEventHandler(string name)
{
Name = name;
} public void Execute(UIApplication app)
{
if(ExecuteAction!=null)
{
try
{
ExecuteAction(app);
}
catch
{ }
}
} public string GetName()
{
return Name;
}
}

接下来,通过控件来实现创建构件。

public partial class ModelessView : Window
{ ExecuteEventHandler _executeEventHandler= null;
ExternalEvent _externalEvent = null; public ModelessView(ExecuteEventHandler executeEventHandler,ExternalEvent externalEvent)
{
InitializeComponent();
_executeEventHandler = executeEventHandler;
_externalEvent = externalEvent;
} private void creatLine_Click(object sender, RoutedEventArgs e)
{
if(_externalEvent!=null)
{
_executeEventHandler.ExecuteAction = new Action<UIApplication>((app) =>
{
if (app.ActiveUIDocument == null || app.ActiveUIDocument.Document == null)
return; Document revitDoc = app.ActiveUIDocument.Document;
using (Transaction transaction=new Transaction(revitDoc,"Creat Line1"))
{
transaction.Start();
Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(new XYZ(, , ), new XYZ(, , ));
SketchPlane sketchPlane = SketchPlane.Create(revitDoc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ, XYZ.Zero));
revitDoc.Create.NewModelCurve(line as Curve, sketchPlane);
transaction.Commit();
}
});
_externalEvent.Raise();
}
} private void creatLine2_Click(object sender, RoutedEventArgs e)
{
if (_externalEvent != null)
{
_executeEventHandler.ExecuteAction = new Action<UIApplication>((app) =>
{
if (app.ActiveUIDocument == null || app.ActiveUIDocument.Document == null)
return; Document revitDoc = app.ActiveUIDocument.Document;
using (Transaction transaction = new Transaction(revitDoc, "Creat Line2"))
{
transaction.Start();
Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(new XYZ(, , ), new XYZ(, , ));
SketchPlane sketchPlane = SketchPlane.Create(revitDoc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ, XYZ.Zero));
revitDoc.Create.NewModelCurve(line as Curve, sketchPlane);
transaction.Commit();
}
});
_externalEvent.Raise();
}
}
}

这就是一个简单的非模态窗口实现的办法。

Revit 模态框的更多相关文章

  1. js控制Bootstrap 模态框(Modal)插件

    js控制Bootstrap 模态框(Modal)插件 http://www.cnblogs.com/zzjeny/p/5564400.html

  2. Bootstrap模态框按钮

    1.触发模态框弹窗的代码 这里复制了一段Bootstrap模态框的代码 <h2>创建模态框(Modal)</h2> <!-- 按钮触发模态框 --> <but ...

  3. boostrap 模态框

    <div class="modal fade" id="myModal" tabindex="-1" role="dialo ...

  4. 解决bootstrap模态框内输入框无法获取焦点

    bootstrap 模态框中的input标签在某些情况下会无法获取焦点. 最终解决方法:去除模态框的 tabindex="-1" 属性即可

  5. 使用RequireJs和Bootstrap模态框实现表单提交

    下面我将使用requirejs结合模态框实现三五行代码部署表单提交操作. 传统开发思路如下:

  6. 使用js实现显示系统当前时间并实现倒计时功能并触发模态框(遮罩)功能

    常常在我们的网页中需要倒计时来触发一些函数,例如遮罩等,在本项目中,通过使用jquery,bootstrap,实现了显示系统当前时间,并且实现了倒计时的功能,倒计时实现后将会弹出模态框(遮罩层).模态 ...

  7. 修改bootstrap modal模态框的宽度

    原文链接:http://blog.csdn.net/wuhawang/article/details/52252912 修改模态框的宽度很简单,修改width属性就可以了 但是要注意的一点是,修改的不 ...

  8. Bootstrap 模态框(Modal)插件

    原文链接:http://www.runoob.com/bootstrap/bootstrap-modal-plugin.html Bootstrap 模态框(Modal)插件 模态框(Modal)是覆 ...

  9. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

随机推荐

  1. UVA10562(看图写树,dfs)

    这个题过的好艰难,不过真的学到好多. 关于fgets的用法真的是精髓.!isspace(c)和c!=' '是有区别的. 其它的看代码吧 #include <iostream> #inclu ...

  2. 1(3)IO流------字符流

    一.分类 字节流(不适用于文本) InputStream OutputStream 字符流 Reader Writer 二.字符流 按照字符为单位,英文1-1,中文看是UTF-8编码还是GBK编码 字 ...

  3. asdasf

    bigFile = open('big.txt',mode='r',encoding='utf-8') bigText = bigFile.read() bigFile.close() print(b ...

  4. 利用Python中的for循环和while循环,打印各种方向的九九乘法表。

    哈喽大家好,今天,可乐来给大家分享一下Python中用for循环和while循环打印九九乘法表的操作.由于本人也是刚刚接触Python不长时间,代码也是自己编写的,所以有什么不足之处还请大家多多指教. ...

  5. linux磁盘分区笔记

    磁盘基本概念: 硬盘结构:盘片+磁头(盘片可以有多个),工作时盘片高速运转,磁头读取数据 U盘.SSD固态硬盘是用闪存来制作的设备,没有盘片和磁头 Linux磁盘文件名: Linux所有设备都抽象为文 ...

  6. C++——智能指针unique_ptr的实现

    起初,我最直观的设计想法,直接设计一个类:包含全部要素(对象,指针计数).然后提供出去. class CPoint { public: CPoint(, ) : x(xVal), y(yVal) {} ...

  7. docker容器以ROOT账号登录(获取ROOT权限/ROOT密码)

    第一步:查看容器的CONTAINER ID docker ps 第二步:获取root权限,例如需要进入的CONTAINER ID为4650e8d1bcca docker exec -ti -u roo ...

  8. http请求返回响应码及意义

    http 响应码及意义 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.它由 RFC 2616 规范定义的,并得到RFC 2518.RFC 281 ...

  9. vue 深拷贝

    Vue.set(row,'isEdit',true); let newRow = JSON.parse(JSON.stringify(row)); this.totalData.push(newRow ...

  10. python之路——20

    学习内容 1.序列化——数据类型转向字符串数据类型 反序列化——字符串转向数据类型2.序列化模块 json模块 通用序列化格式 弊端:只有少部分数据类型可通过json转化 pickle模块 所有的py ...