1、AutoCAD时代的二次开发
笔者曾回顾了1980年代前早期计算机辅助设计(CAD)软件的发展历史,见(天天用AutoCAD画图的你,真的了解CAD的历史吗?)。1980年代,由于Apple和IBM相继推出了自己的个人电脑,单用户计算机开始蓬勃发展。同时,电子CAD,机械CAD和建筑CAD被分成了不同的产业。也是在这一时期,基于售价在1000美元,能够运行在PC上的CAD程序的想法,John Walker于1982年4月创立了Autodesk公司并推出了后面工程师几乎每天都要使用的AutoCAD。在引入AutoCAD之前,大多数商业CAD程序都在大型计算机或小型计算机上运行,每个CAD操作员(用户)都在单独的图形终端上工作。AutoCAD取得了巨大的成功,迅速占领了二维绘图领域的广大市场,一度成为CAD的代名词,DWG文件格式也成为二维图形的事实标准。
我国其实在很早也开始了CAD系统的自主研发,从“七五”到“九五”这段时间内,一些高校和科研单位已经开发出一些CAD软件,但是商业化和市场化都做的较差。在1991年,随着时任国务委员宋健提出的“甩图板”口号,我国CAD行业开始了蓬勃发展阶段,国内众多CAD企业如雨后春笋般发展起来,比较有代表性的有中科院凯思PICAD,高华CAD、开目CAD,中望CAD等等。这时候AutoCAD也开始进入中国市场,此时国内CAD行业的发展大致可以分为两个方向,一个是坚持自主开发国产CAD系统,另外一个就是基于AutoCAD进行二次开发。
AutoCAD作为一种通用的绘图软件,对具体行业中设计的具体细节把握力量不够。主要表现为对于专业中经常用到的图形每次都要重新绘制,这就需要在图形中将这些基本的图元或者图块设置为一个基本的元素以便重复利用;另外早期结构计算软件中模型的建立和结构图纸的绘制是分开的,这就要求在计算时必须重新建模,这造成了大量的重复劳动。而且早期很多的数值模拟软件是没有比较完好的前处理和后处理文件的,结构输入和结果输出还是用文本文件如*.dat格式等。这一点在ABAQUS还可以看出,ABAQUS的CAE还是不能支持所有的关键字,有些功能还需要修改input文件才能使用。从这两点来看,基于通用CAD程序的二次开发是有现实的需求并且有广大的市场的。
所谓“二次开发”是指由熟悉产品设计,同时又掌握计算机应用技术的人员在某一软件平台上围绕产品设计的具体要求而对软件进行的应用开发。
AutoCAD公司自从推出第一版软件起就相应的推出了二次开发工具。并且随着AutoCAD技术的不断发展和新版本的不断推出,其相应的二次开发技术也有了很大的发展。AutoCAD 的几种二次开发工具,历经三个时代,分别为:AutoLISP、ADS、DSL、ADSRX、ObjectARX、ActiveX、VBA、Visual Lisp 和 AutoCAD.NET。其中,AutoCAD.NET只适用于2006以上的版本。通过二次开发可以将AutoCAD的功能针对某个特定的领域进行扩展,并且方便外部程序访问DWG程序中的数据用于数值计算软件建模。
AutoCAD开放api允许其他企业或者个人以此为基础进行二次开发可以说是一个非常成功的战略。他可以让Autodesk公司在专注自身软件的开发的同时,将一些细分的领域留给其他专业的公司,这样AutoCAD能迅速的适应市场的需求,快速的占领市场。这从Autodesk的市场行为就可以看出,在autoCAD与国产CAD的竞争中,其培养了大量的二次开发商来开发更加贴合国内设计人员和工程人员需求的插件,克服了刚进入中国市场的“水土不服”问题,占领了中国CAD的大部分市场。
成立于1992年的浩辰就是最早的一批基于AutoCAD进行二次开发的公司,现在还比较知名的AutoCAD的二次开发商还有,1994年成立的天正公司(天正CAD我想大家都听说过),还有后面于1998年成立的广联达,2000年成立的斯维尔以及2001年成立的鲁班等等。
2、Revit API和Revit二次开发
在开始讲述revit二次开发前,还是有必要了解下revit软件的发展历程。Revit最初由成立于1997年的Charles River Software开始开发。Charles River Software于2000年更名为Revit Technology Corporation,并于2002年被Autodesk收购。2013年以前revit structure, revit MEP 和revit architecture是分开的。2013年不同专业的合并在一个revit软件中。在revit模型中,所有的图纸、二维视图和三维视图以及明细表都是都是同一个基本建筑模型数据库的信息表现形式。有一种观点认为Revit在BIM时代就相当于二维CAD时代的AutoCAD。
在Revit被收购之前它是没有API的,被收购后Autodesk开始提供Revit二次开发的API接口。API是应用程序接口(Application Programming Interface)首字母缩写。Revit API是建立在Revit产品的基础上的,它是一个类库,需要在Revit运行时才能够工作。Revit API允许使用者通过任何与.NET兼容的语言来编程,第三方开发者能够通过Revit API将他们的应用程序集成到Autodesk Revit中。利用API我们可以创建插件来完成对UI的增强,对一些重复工作的自动化,导入外部数据来建立单元或者设置参数值,连接到外部数据库,转换数据到分析应用,访问模型的参数数据等等一系列功能。
Revit二次开发主要就是生成能够完成一定功能的动态链接文件dll文件(和exe文件类似,但是没有命令执行的起点),dll文件可以被链接到主程序那里。Revit二次开发一般可以分为外部命令(用于执行某个操作),外部应用(用于创建选项卡)和数据库级别的外部应用三种。(需要说明一点的是,在进行revit二次开发时,revit sdk并不是必不可少的)。
3、Revit二次开发步骤
下面就以创建外部命令为例子来说明下二次开发的步骤
(1).新建一个类库/Class Library 工程
(2). 引用Revit接口定义文件RevitAPI.DLL 和RevitAPIUI.DLL,将RevitAPI和RevitAPIUI的Copy Local 属性设置为False(避免生成dll文件的时候,将很多相关的类库复制过来)。
Revit API.dll 程序集包含了访问Revit中DB级别的Application、Document、Element以及Parameter的方法,也包含了IEXternalDBApplication接口和其他相关的接口。
Revit APIUI.dll 程序集包含了所有操作和定制Revit UI的接口,包括:IEXternalCommand相关接口,IExternalApplication相关接口,selection选择,菜单类RibbonPanel,RibbonItem以及其子类,TaskDialog是任务对话框。
(3). 命名空间引用并为命令类加属性
首先要引入如下的命名空间
然后添加如下的属性
Transaction主要控制命令的事务行为,是一个必选属性。有3个取值,Manual,Automatic和ReadOnly。一般选择Manual,表示需要在自己的外部命令中创建自己的事务(Transaction)。
Regeneration控制模型修改后是否会重新生成。早期版本中其有两个属性,Automatic和Manual,分别表示自动重建和手动重建。自动重建(Automatic)在模型每次修改后都会重建模型,对计算机资源消耗比较大。现在Automatic已经不再被支持,只有Manual一个选项。
Journaling控制执行过程命令的日志行为。NoCommandData则不会把JournalData的内容写到revit日志中。
(4). 然后创建一个名为MyCommand(可以自由取名)的类(class)。由于是实现外部命令,新建类需要实现IExternalCommand接口。接口是包含非抽象类或结构必须实现的一组相关功能的定义。IExternalCommand接口要求实现Execute()方法。
Execute包括3个参数,1个传入参数commandData,2个输出参数message和elements
传入参数CommandData,由此获取应用程序对象和文档对象
传出参数 message:传出提示字符串,提示用户存在的问题
传出参数 ElementSet:传出一个对象集合,用户可查看其中的对象
(5).在Execute中添加代码来实现命令功能
在完成上述步骤,你将得到如下的代码。通过build生产相应的dll文件。
4、插件的注册
在生成dll文件后,需要将*.dll文件注册到revit中,以便revit调用。早期是通过修改Revit.ini文件来注册add-in,由于修改ini文件非常麻烦而且所有的用户都使用同一个ini文件,如果反复添加或者删除add-in,*.ini文件将会变得难以维护。从revit 2011开始,开始采用*.addin文件来对插件进行注册。*addin文件是一个xml文件,XML是一种可扩展标记语言也是元标记语言,所谓“元标记”就是开发者可以根据自己的需要定义自己的标记。.NET提供了能够读取、写入和修改 Revit *addin文件的API (RevitAddInutility.dll)。可以参阅 SDK 安装文件夹中的 RevitAddIninin.chm来查看如何调用这个api。
对于所有用户都能使用的插件,*.addin文件需要放到下列文件中(笔者使用的revit 2018,如果是其它版本,2018需要换成相应的版本)
C:ProgramDataAutodeskRevitAddins2018
下面我截取了橄榄山和Dynamo的addin文件,通过这两个的对比,我们很容易得知各个xml标签的含义。需要指出一点,AddInId是一个GUID,它能提供给*.dll一个唯一的标识,具体可以参考如下链接
(https://docs.microsoft.com/en-us/dotnet/api/system.guid?redirectedfrom=MSDN&view=netcore-3.1)。
最后,重启revit,既可以在附加模块,外部工具中找到我们编写的命令,点击就得到了helloRevit的对话框(注意我使用了add-in manager)。
5、后记
从编程的角度来说,如果对C#面向对象编程有一些基础,revit API二次开发入门还是很直接的。但通过一段时间的学习,可以明显感到了解C#编程对于revit API 开发只是一个基础,要想深入的学习revit二次开发,对revit中各种元素(element)之间的关系,参数,以及各种概念必须要理解和掌握。
另外,在学习Revit二次开发时也不得不考虑发展前景的问题。目前,早期基于AutoCAD进行二次开发的公司大多数已经开展了基于Revit的二次开发,并推出了相应的产品。在Revit二次开发时代也出现了一些新的公司,如橄榄山。
另外一个值得探讨的问题是,CAD技术是工程设计行业重要的核心竞争力之一,“中兴事件”中美国对中国禁运重要的一项就是停止提供电子设计自动化软件(EDA)和相关服务,这也让国人认识到工业软件的重要性。在AutoCAD时代,基于AutoCAD的二次开发实质上起到了帮助AutoCAD适应中国人的使用习惯和并大量占领国内市场的作用。这也间接导致国内拥有自主知识产权的CAD软件发展减缓,很多国产CAD最后“烟消云散”。而且由于是基于AutoCAD二次开发,国内相关企业的发展不得不仰人鼻息,后期的发展也受到了限制。在国外CAD企业占领国内市场后,开始逐渐打压国内CAD企业的发展,从对浩辰CAD的访谈中可以看到这一点。现在到了BIM时代,我们必须思考基于Revit的二次开发是否同样会导致与基于AutoCAD进行二次开发类似的结果。而且,BIM模型所包含的数据量相对于二维CAD图形有了极大增加,BIM的一个重要发展方向就是如何高效合理的利用BIM中的数据,这要求我们对模型中数据的组织有更加深刻的理解。基于以上两方面的考虑,我们在进行二次开发时都要更加注意平台的选择和核心技术的积累。
参考文献
[1]https://blog.csdn.net/hunter_wwq/article/details/39928641
[2]http://tangent.com.cn/about/
[3]Revit 2011 API Developer Guide (https://vdisk.weibo.com/s/ahpJeVrF3thfU)
[4]http://news.tom.com/202004/4529987788.html
[5]http://en.wikipedia.org/wiki/Autodesk_Revit
[6]http://www.elecfans.com/bandaoti/eda/20190305878979.html
为了方便大家交流技术和互通行业资讯,
请添加我们“转自:非解构-公众号”微信,
加入相关讨论交流群。