Revit 模态框
非模态窗口有一个好处,就是可以一直停留在程序之前,然后持续完成操作。但是在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 模态框的更多相关文章
- js控制Bootstrap 模态框(Modal)插件
js控制Bootstrap 模态框(Modal)插件 http://www.cnblogs.com/zzjeny/p/5564400.html
- Bootstrap模态框按钮
1.触发模态框弹窗的代码 这里复制了一段Bootstrap模态框的代码 <h2>创建模态框(Modal)</h2> <!-- 按钮触发模态框 --> <but ...
- boostrap 模态框
<div class="modal fade" id="myModal" tabindex="-1" role="dialo ...
- 解决bootstrap模态框内输入框无法获取焦点
bootstrap 模态框中的input标签在某些情况下会无法获取焦点. 最终解决方法:去除模态框的 tabindex="-1" 属性即可
- 使用RequireJs和Bootstrap模态框实现表单提交
下面我将使用requirejs结合模态框实现三五行代码部署表单提交操作. 传统开发思路如下:
- 使用js实现显示系统当前时间并实现倒计时功能并触发模态框(遮罩)功能
常常在我们的网页中需要倒计时来触发一些函数,例如遮罩等,在本项目中,通过使用jquery,bootstrap,实现了显示系统当前时间,并且实现了倒计时的功能,倒计时实现后将会弹出模态框(遮罩层).模态 ...
- 修改bootstrap modal模态框的宽度
原文链接:http://blog.csdn.net/wuhawang/article/details/52252912 修改模态框的宽度很简单,修改width属性就可以了 但是要注意的一点是,修改的不 ...
- Bootstrap 模态框(Modal)插件
原文链接:http://www.runoob.com/bootstrap/bootstrap-modal-plugin.html Bootstrap 模态框(Modal)插件 模态框(Modal)是覆 ...
- Bootstrap <基础三十二>模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用 ...
随机推荐
- 1(3)IO流------字符流
一.分类 字节流(不适用于文本) InputStream OutputStream 字符流 Reader Writer 二.字符流 按照字符为单位,英文1-1,中文看是UTF-8编码还是GBK编码 字 ...
- 前端自定义format函数,做字符串格式化功能
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- viewport定义,弹性布局,响应式布局及LESS和SASS框架应用
一,移动端宽度设置 viewport视图窗口,<meta name="viewport" content="width=device-width,initial-s ...
- CMDB-实现的几种方式
CMDB的用处:手机服务器的元信息 LINUX基础指令 查看IP地址 : ifconfig 查看主机名: hostname 查看CUP信息: cat /proc/cpuinfo 查看磁盘信息 : df ...
- 将 windows 目录结构 复制到 linux 上
思路:生成目录结构文件,复制到linux上,然后建立每个文件即可 借助unix_utils( https://sourceforge.net/projects/unxutils/) 1. window ...
- Go Example--json
package main import ( "encoding/json" "fmt" "os" ) type Response1 stru ...
- ANSYS稳态热分析
目录 题目 APDL操作 温度云图 题目 管子内径外径为r1=4.125mm,r2=4.635mm,中间物体的产热功率为Q=8.73e8W/m3,管外有温度t=127℃的冷水流过,冷却水与管子外表面的 ...
- 第七节《Git协议与工作协同》
Git提供了丰富的协议支持,包括:SSH.GIT.HTTPS.FTP.FTPS.RSYNC,这些协议可以分为两类:智能协议和哑协议. <1>智能协议 在会话时使用智能协议,会在会话的两个版 ...
- c++中函数指针作为int传递
int f() { ; } typedef int (*method)(); int _tmain(int argc, _TCHAR* argv[]) { int value = (int)& ...
- Developing avb
ai automake ai libtool ai pkg-config autogen ai libgstreamer1.0-0 ai libgstreamer1.0-dev ai chec ...