WPF的学习和使用二:WPF 与 Revit 的进阶交互 @Revit二次开发

在WPF与Revit的普通交互过程中,我们一次只能调用一个外部命令,也就是说在交互界面上,只能有一个按钮给我们操作。对于多按钮,多命令的执行需要下,我们就需要使用外部事件了。

外部事件的使用

外部事件使用的接口是IExternalEventHandler,一般用于你直接调取的命令上,Handler本意是操作员、搬运工的意思,还是以创建墙为例,代码如下:

using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ExternalEventDemo
{class CreateWall : IExternalEventHandler{public double WallHeight{ get; set; }public void Execute(UIApplication app){// 【1】获取当前文档// Document doc = commandData.Application.ActiveUIDocument.Document;Document doc = app.ActiveUIDocument.Document;MainWindow mainWindow = new MainWindow();double height = WallHeight / 0.3048;//  【2】获取族实例为 CL_W1 的墙: FilteredElementCollector collector = new FilteredElementCollector(doc);Element ele = collector.OfCategory(BuiltInCategory.OST_Walls).OfClass(typeof(WallType)).FirstOrDefault(x => x.Name == "Generic - 90mm Brick");WallType wallType = ele as WallType; // Element 类型转换为 WallType//  【3】 获取标高// 链式编程Level level = new FilteredElementCollector(doc).OfClass(typeof(Level)).FirstOrDefault(x => x.Name == "Level 1") as Level;// 【4】创建线XYZ start = new XYZ(0, 0, 0);XYZ end = new XYZ(10 / 0.3048, 0, 0);XYZ anotherpoint = new XYZ(10 / 0.3048, 10 / 0.3048, 0);Line geomline = Line.CreateBound(start, end);//  无连接高度// double height = 15 / 0.3048; // 用英尺表示,1英尺 = 0.3048米double offset = 0;// 创建墙,需要事务创建Transaction ts = new Transaction(doc, "创建墙");ts.Start();Wall wall = Wall.Create(doc, geomline, wallType.Id, level.Id, height, offset, false, false);ts.Commit();}public string GetName(){return "CreateWall";}}
}

同理,我还可以再设置一个操作员去创建第二面墙叫CreateWallTwo。

那谁去指挥这些 Handler 呢,在MainWindow.xaml.cs里面可以集中指挥,代码如下:

using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace ExternalEventDemo
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{// 【1】注册外部事件CreateWall createwallCommand = null;CreateWallTwo createwalltwoCommand = null;ExternalEvent externalWallEvent = null;ExternalEvent externalWallTwoEvent = null;public MainWindow(){// 【2】初始化事件InitializeComponent();//【2-1】第一个命令createwallCommand = new CreateWall();externalWallEvent = ExternalEvent.Create(createwallCommand);// 【2-2】第二个命令createwalltwoCommand = new CreateWallTwo();externalWallTwoEvent = ExternalEvent.Create(createwalltwoCommand);}private void Button_Click(object sender, RoutedEventArgs e){//【3-1】执行事件1createwallCommand.WallHeight = Convert.ToDouble(this.textBox.Text);externalWallEvent.Raise();}private void Button_Click_1(object sender, RoutedEventArgs e){// 【3-2】执行事件2createwalltwoCommand.WallHeight = Convert.ToDouble(this.textBoxTwo.Text);externalWallTwoEvent.Raise();}}
}

然后我们还需要一个交互程序MainProgram.cs 去把MainWindow 以非模态化的窗口展示在Revit中,详细代码如下。

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ExternalEventDemo
{[Transaction(TransactionMode.Manual)]class MainProgram : IExternalCommand{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){MainWindow mainWindow = new MainWindow();//非模态窗口mainWindow.Show();return Result.Succeeded;}}
}

最终效果如下:

WPF的学习和使用二:WPF 与 Revit 的进阶交互相关推荐

  1. WPF学习拾遗(二)TextBlock换行

    原文:WPF学习拾遗(二)TextBlock换行 下午在帮组里的同事解决一个小问题,为了以后方便,把就把它收集一下吧. 新建一个TextBlock作为最基础的一个控件,他所携带的功能相对于其他的控件要 ...

  2. WPF基础学习笔记(一)Dependency Object 和 Dependency Property

    .依赖属性是WPF个人觉得对精彩和最有特色的部分.所以特地先拿出来. 首先要实现Dependency Property 则必须要继承Dependency Object.如果看下WPF的基础控件其实都间 ...

  3. WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口

    原文:WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/powertoolsteam/ar ...

  4. WPF中的动画——(二)From/To/By 动画

    原文:WPF中的动画--(二)From/To/By 动画 我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画: var widthAnimati ...

  5. WPF中的动画——(二)From/To/By 动画(二)

    WPF中的动画--(二)From/To/By 动画 我们所实现的的动画中,很大一部分是让一个属性在起始值和结束值之间变化,例如,我在前文中实现的改变宽度的动画: var widthAnimation ...

  6. WPF入门学习----系列基础教程

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...

  7. WPF 项目开发入门(二) WPF 页面布局

    WPF 项目开发入门(一) 安装运行 WPF 项目开发入门(二) WPF 页面布局 WPF 项目开发入门(三)WPF 窗体与页面 WPF 项目开发入门(四) MVVM 模式 与 TreeView树组件 ...

  8. 学习OpenCV(7) 在WPF程序中使用EmguCV

    在WPF程序中使用EmguCV 在WPF中使用EmguCV主要要处理的是ImageBox控件在WPF页面上的使用和如何利用WPF的双向数据绑定来向ImageBox上显示图片. 新建WPF应用 使用VS ...

  9. VSTO学习笔记(二)Excel对象模型

    原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...

最新文章

  1. 电子信息工程水声考研去向_哈工大电子与信息工程专业考研 科研方向汇总
  2. OAM 深入解读:使用 OAM 定义与管理 Kubernetes 内置 Workload
  3. Android 自定义Button按钮显示样式(正常、按下、获取焦点)
  4. 保存MATLAB中间变量值的方法:保存为txt文件或者mat文件
  5. utf8 bom 去掉 java_utf-8-BOM删除bom
  6. win10下安装和卸载Ubuntu双系统
  7. Linux 冯诺依曼体系结构
  8. 转发:关于数据权限设计的思考
  9. 如何制作一个有颜色的ListBox,颜色选择下拉列表
  10. Python成员修饰符,metaclass,异常,反射,单例
  11. Windows下SVN备份脚本
  12. 在linux上运行爬虫任务报错:Overridden settings******
  13. JAVA多线程模拟火车站售票大厅
  14. rxJava中 Subscriber 与Observer
  15. A. 拼音魔法 大学生程序设计邀请赛(华东师范大学)
  16. MobTech 秒验|极速验证,拉新无忧
  17. java jdom 类_JDOM常用类介绍及示例代码
  18. 计算机配置中什么表示硬盘,电脑硬盘的分类介绍 硬盘中的Master和Slave代表什么意思...
  19. C++实现U盘小偷(超详细版)
  20. [Kubic] Lines

热门文章

  1. JRXH静态信号继电器
  2. CIS【CMOS Image Sensor】是什么?
  3. 38.6歌曲计算机,目前最火的6首歌曲, 38度6垫底, 沙漠骆驼第二, 第一百听不厌
  4. 钉钉“宜搭”,产品经理的需求管理利器
  5. 八年级计算机教案下册,八年级信息技术下册教案
  6. 820计算机基础学校,[定稿]计算机基础教案33820V5.1(全文完整版)
  7. Vite知识体系简述
  8. 百姓网发帖机,发帖机是什么来的
  9. 【NOWCODER】- Python:字典(一)
  10. 郑重推荐使用WPS 2010