一、前言

       BIM:Building Information Modeling 建筑信息模型,就是将建筑的相关信息附着于模型中,以管理该建筑在设计、算量、施工、运维全生命周期的情况。创建模型的主要主流软件有Autodesk(欧特克)的Revit、Bentley的microstation、达索的CATIA(曾被我国在80、90年代用于制造战斗机,比较高端)。我所在的企业是从事BIM软件的,隶属于一家上市企业。

我在两个部门工作过。第一个部门是算量软件部门,专门制作基于Revit的算量插件(桌面端)。第二个部门是BIM数据平台部门,专门为大型企业制作BIM施工管控平台(Web及移动App端)。刚研究生毕业即进入公司,在两年整的工作中主要负责WPF(DevExpress)、识别算法、网络通信编程(Remoting、WebService、WCF、Socket)以及Web开发。

架构的改造也是我工作的一部分,站在公司老司机的肩膀上还是很爽的。那么,我就从桌面端软件开始吧!

二、架构简图

制作Revit插件必须要引用2个dll:RevitAPI和RevitAPIUI,每年根据Autodesk发布Revit产品进行迭代,支持C#、Managed C++及VB编程。

该解决方案共含有15个C#项目,红色模块都需要引用Revit的dll,灰色部分不用引用。编译完之后,在C:\ProgramData\Autodesk\Revit\Addins\201X添加相应的.addin文件,并指向Product.App的位置即可,然后运行Revit的软件即可使用插件。

<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns><AddIn Type="Application"><Name>Product</Name><Assembly>X:Path\Product.App.dll</Assembly><ClientId>a21827a2-6610-445b-a625-8d9f4a52f218</ClientId><FullClassName>Product.App.ExternalApplication</FullClassName><VendorId>BIMproduct</VendorId><VendorDescription>BIMproduct www.product.com</VendorDescription></AddIn>
</RevitAddIns> 

三、架构解读

1. App201X

该项目是Revit插件的入口,主要由ExternalApplicationExternalCommand组成。需要引用其它的项目。该项目的ExternalApplication需要实现一个Revit接口:IExternalApplication。

ExternalApplication在OnStartup函数中可以做一些初始化工作,比如初始化依赖反转容器、创建Ribbon按钮、初始化载入一些第三方dll、产品的授权检测等等。

namespace Product.App
{public class ExternalApplication:IExternalApplication{public  Result OnStartup(UIControlledApplication application){try{
#if !REVIT2014CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("zh-CN");
#endifThread.CurrentThread.CurrentCulture = new CultureInfo("zh-CN");Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");// Refer to: https://stackoverflow.com/questions/4041197/how-to-set-and-change-the-culture-in-wpf// 使用“System.Windows.Documents.TextElement”以和QS或其他插件中的“FrameworkElement”区别FrameworkElement.LanguageProperty.OverrideMetadata(typeof(System.Windows.Documents.TextElement),new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));}catch (Exception ex){if (ex is System.ArgumentException){// 有可能“System.Windows.Documents.TextElement”已被注册过. Do nothing}else{return Result.Succeeded;}}try{//Initialize}catch (Exception ex){return Result.Succeeded;}return Result.Succeeded;}public Result OnShutdown(UIControlledApplication application){try{//shoutdown }catch (Exception){// do nothing...}return Result.Succeeded;}}
}

ExternalCommand主要负责插件上的按钮,以“关于”按钮为例:

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)][Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]public class AboutCommand : ExternalCommandBase{protected override Result RunImpls(ExternalCommandData commandData, ref string message, ElementSet elements){AboutWnd aboutWnd = new AboutWnd();// 出现异常时,关闭窗体try{aboutWnd.ShowDialog();}finally{aboutWnd.Close();}return Result.Succeeded;}public override bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories){return true;}public override bool IsProductLicenseValid(){return true;}}

可以看到该命令并没有直接实现IExternalCommand, IExternalCommandAvailability两个接口。而是再封装一个抽象基类,让抽象基类实现Revit的这俩个接口。然后相关的Command再继承这个抽象基类。为什么这么做是因为抽象基类中还可以做一些检查授权等等的事情。

namespace Product.App
{public abstract class ExternalCommandBase:IExternalCommand, IExternalCommandAvailability{protected static bool _allowMultiRun = false;protected static bool _isRunning = false;/// <summary>/// /// </summary>/// <param name="commandData"></param>/// <param name="message"></param>/// <param name="elements"></param>/// <returns></returns>public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){if(!_allowMultiRun && _isRunning){return Result.Cancelled;}if (!IsProductLicenseValid()){Container.Resolve<IMessageBox>().ShowInfo("授权失败,无法使用!");return Result.Cancelled;}_isRunning = true;try{                string msg = $"run command '{this.GetType().Name}'";Container.Resolve<ILog>().Info(msg);var res = RunImpls(commandData, ref message, elements);_isRunning = false;return res;}catch (Autodesk.Revit.Exceptions.OperationCanceledException){_isRunning = false;// generally, it's select cancel exceptionreturn Result.Cancelled;}catch (Exception ex){_isRunning = false;if (ex.Message== "The active view is non-graphical and does not support capture of the focus for pick operations."){Container.Resolve<IMessageBox>().ShowWarning("当前焦点不在视图区域,请将焦点停留在某个视图中。");return Result.Failed;}string errorMsg = $"exception in command '{this.GetType().Name}': {ex}";Container.Resolve<ILog>().Error(errorMsg, ex);message = ex.Message;return Result.Failed;}}protected string GetProductName(){return Container.Resolve<IApplication>().ProductLicenseName;}/// <summary>/// Implements this method to provide implementation for Execute/// </summary>/// <param name="commandData"></param>/// <param name="message"></param>/// <param name="elements"></param>/// <returns></returns>protected abstract Result RunImpls(ExternalCommandData commandData, ref string message, ElementSet elements);public virtual bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories){return false;}public virtual bool IsProductLicenseValid(){
#if DEBUGreturn true;
#elsereturn LicenseService.IsRegistered(GetProductName(), Container.Resolve<IApplication>().LicenseServerURL);
#endif}}
}

2. Common、Common.RevitExt201X

Common项目主要定义基本的数据接口和定义依赖反转容器,注意该项目中并没有引用Revit的dll,说明其中的数据定义是不依赖于Revit的。

与Revit有关的数据定义都放在Common.RevitExt201X,比如自定义的DockablePanel接口(继承IDockablePaneProvider)。

3. UI、UI.Common、UI.RevitExt201X

UI项目主要用于制作点击命令后产生的界面UI,该项目采用MVVM框架进行界面实现,文件夹梳理可如下:

UI.Common主要是用于制作可复用的自定义控件、进度条、常用Converter;

UI.RevitExt201X主要是用于控制DockablePanel和控制Revit构件显示效果,其依赖于Revit。

4. Resource、Unity4Net、Report201X

Resource项目用于多语言版本;

Unity4Net项目用于对Windows的一些操作进行封装;

Report201X项目用于输出报表。报表因为其有一定的业务逻辑,并不是一个单纯的UI界面汇总,所以单独做成一个project会比较好。

5. RevitAPIUtil201X

该项目用于对rvt中的构件进行直接的API操作,但不含有任何的业务逻辑。比如获取构件的若干面,获取长度等等。

6. Core201X

该项目用于核心业务逻辑。当用户在UI界面中点击某按钮,其执行的核心在该项目中。

7. Foundation、Foundation.RevitExt201X

Foundation项目用于进行基本的常数定义,全局定义,授权检查配置等等。

Foundation.RevitExt201XApp201X息息相关,App201X中的ExternalApplication的OnStartup中的相关初始化逻辑比较多,将核心的部分抽出放在该项目中。

8. DBManager

该项目用于对数据库进行操作,Revit插件如果只用自带的revit数据缓存是不能满足现实需求的,需要使用小型数据库,推荐使用SqlLite数据库。

9. ProjectManager

因为算量软件的第一步是工程设置,之后计算的正确性都需要正确的工程设置,所以将工程设置单独抽出而不是放在Core201X中。

Revit 插件产品架构梳理相关推荐

  1. 深度分析:经典视频产品架构拆解

    本文由作者 大橘子-huiqing 发布于社区 01 产品架构 产品架构就是在充分理解产品用户需求基础上对产品数据流转的逻辑梳理.简言之,就是产品架构是功能梳理+策略整合.纯银曾经说真正拥有产品架构能 ...

  2. 听高级产品经理来聊一聊,什么是产品架构

    经历过需求的采集.分析和筛选,我们对产品的定位和用户的需求有了越来越深刻的认识,对整个产品方向的把控和版本迭代节奏也会更有感觉.这种感觉你也可以称之为"产品感",虽然讲得有点悬乎, ...

  3. 线上分享 | 产品架构搭建:从业务到体系

    分享嘉宾 三爷 头部互联网公司产品线负责人,MBA特约讲师.独立创业者 拥有多款集团级业务从0到1并带领实现商业化布局的经验 京都大学访问学者,<中台产品经理宝典>作者 分享大纲 一.企业 ...

  4. 看看老司机是如何提升B端产品架构能力的

    曾经有人问我:你是如何在一年内,把一个收费SaaS产品的订单年增长率从2.5倍提升到4.3倍的. 我回答道:并没有做什么特别的工作,无非是避免做错误的功能,同时把正确的功能做到最好.把资源配置在正确的 ...

  5. 建模大师怎么安装到revit中_工程师最爱的REVIT插件,让BIM建模溜到飞起!

    今日BIM公益培训:Revit 如何使用简化的二维图形代替复杂的三维模型平面投影私信--获取视频链接 手绘时代加班到晚上7点,CAD时代加班到晚上12点,BIM时代加班到第二天7点.为什么科技进步,我 ...

  6. jsapi设计_Sketch插件如何架构

    Sketch插件如何架构 Sketch插件跟我们平时用得比较多的Chrome插件类似,都是可以调用容器提供的API来实现各种个样的能力. Sketch的强大之处在于,它可以调用OSX系统级别的API. ...

  7. SaaS平台产品架构设计

    当我们去搜索"架构",可以得到很多的架构图片,比如组织架构.业务架构.数据架构.技术架构.安全架构.产品架构.部署架构等. 什么是架构,通常大家说架构一般指软件架构,架构是指软件的 ...

  8. 高手必备 | Revit插件到底哪个好?区别是什么?

    大家好,这里是建模助手. 不知道各位BIMer有没有听说过这么一个让人悲催的梗:手绘时代我们加班到晚上7点,CAD时代加班到晚上12点,BIM时代加班到第二天7点. 虽然科技是不断进步了,但是&quo ...

  9. 技术期刊 · 路尘终见泰山平 | 微前端及插件化架构在 Wix 的实践;编辑器架构的第二路径;业务中的前端组件化体系……

    蒲公英 · JELLY技术期刊 Vol.47 不想当架构师的程序员不是"合格"的程序员?这一类的言论在很多文章中应该很常见吧,我们需要架构思维,要有抽象能力,要学会分层--需要的太 ...

最新文章

  1. NVIDIA深度架构
  2. 操作系统学习:启动进入实模式
  3. silverlight1.0绝对是垃圾,中文乱码,没治!
  4. 【Linux网络编程】广播
  5. Git 使用帮助(下)
  6. Java陷阱:内部类中的字段访问
  7. Number.parseInt(), Number.parseFloat()
  8. CentOS 6 下升级安装Mysql 5.5 完整步骤
  9. 揪出数据库中看不见的字符
  10. oracle 10g 扩表空间,Oracle 10g 表空间管理(一)
  11. SQLite Tutorial 1 在ubuntu上安装SQLite 3.8.2
  12. BZOJ4241历史研究题解
  13. Unity中音效插件
  14. CTF入门之php文件包含
  15. vuetify-icon图标显示不正常
  16. Pandas计算同比环比指标的3种方法
  17. 提升电脑运行速度,10个秘笈,让你的win10飞起来
  18. 解决2021版本idea定位图标消失
  19. hive为什么insert into后数据被覆盖了
  20. 科研人快速入门LaTex到日常使用,下载安装配置,语法使用说明等

热门文章

  1. 电竞高性能主机可以改云服务器吗,电竞主机可以做云服务器吗
  2. S7-1500系统内使用ET200S 1SI模块实现Modbus 主站通信
  3. 『ML笔记』深入浅出字典学习1(Dictionary Learning)
  4. 易语言Excel工作簿方法
  5. 超棒的响应式设计测试书签和工具(bookmarks)(转)
  6. 惊梦App:给萌糙的游戏世界添一抹旧时书的古典美
  7. python矩阵计算器_【python实用编程之简单矩阵计算器实现】GUI编程
  8. postman json格式文档转word表格文档
  9. 通讯行业多媒体信息发布系统方案
  10. 多媒体技术是利用计算机对,计算机多媒体技术对影视后期制作的应用