复杂形态钢结构设计培训班

首页 非解构-公众号 AutoCAD ActiveX与RhinoCommand的开发模式对比

AutoCAD ActiveX与RhinoCommand的开发模式对比

很多朋友都对AutoCAD的二次开发很感兴趣。而随着参数化设计的逐渐兴起,Rhino在建筑设计中的运用也渐渐地成为一种趋势。小编从很多年前开始学习AutoLisp,也写过很多工作中常用的AutoLisp的脚本,到近些年开始接触Rhino,尝试grasshopper和Rhino的二次开发。发现两款软件不仅功能上类似,从开发以及软件构架的角度上来说,也有很多相似之处。因此可以把它们放在一起对比。对于这些软件,如果从操作的层面上,大家都可能是驾轻就熟的,但是对于软件本身更深一层次的内容了解不够,而基于这么多年的编写脚本或者二次开发经验,让我觉得从架构的层面上去了解这两款软件,其实也是能够对我们的工作大有裨益的。写这篇文章的目的,就是希望通过两种软件二次开发的对比介绍,帮助大家对这两个软件有更深一个层次的了解,即使不做二次开发,也能够从中得到一些启示。虽然AutoCAD还有.net,ObjectARX等等的二次开发方式,但是为了对比的更加直观,小编还是选择了较为初级并且方便理解的ActiveX。

1.软件开发环境的配置

两款软件官方都有很完备的开发手册。

AutoCAD:

http://help.autodesk.com/view/OARX/2018/ENU/

ActiveX的开发主要参考的是:

(1)ActiveX Developer’s Guide(ActiveX/VBA),主要是开发的方法说明文档.

(2)ActiveX:reference Guide,主要是ActiveX的配置文件库的说明。

RhinoCommon:

https://developer.rhino3d.com/

开发介绍:

https://developer.rhino3d.com/guides/rhinocommon/

API文档:

https://developer.rhino3d.com/api/RhinoCommon/html/R_Project_RhinoCommon.htm

AutoCAD开发环境的配置:

小编首先创建的是.net framework 控制台应用。创建完成后,在控制台的引用中添加AutoCAD二次开发的配置文件:

引用在AutoCad的安装目录C:Program FilesCommon FilesAutodesk Shared下的 acax22enu.tlb和axdb22enu.tlb两个文件,此处的22是AutoCAD2018的版本号,其他版本按照开发说明类推。引用完成后,在引用的位置出现了AutoCAD和AXDBLib两个引用库文件。这样,在.net中AutoCAD的ActiveX的开发环境已经配置完成了。

Rhino开发环境的配置:

在Visual Studio的扩展菜单栏下,点击管理扩展,在联机下搜索RhinoCommon,安装这个插件,重启Visual Studio,此时新建Visual Studio的项目中就包含有相应的RhinoCommon开发模板。根据模板创建好项目后,开发环境自行配置完成。

2.通过程序获取软件对象

此时的这个AcadApplication类就是当前的AutoCAD程序。

而在Rhino中,则可直接通过Rhino这个命名空间就可以获得当前正在运行的rhino程序。Rhino这个命名空间下有两个类,一个是RhinoApp,另外一个是RhinoDoc,分别控制程序的截面和内部文件。

3.软件的数据结构

获取软件对象后,我们需要对软件的数据结构进行一定的介绍,这样无论是针对二次开发,或者针对我们平时的日常使用都能有所帮助。

首先对于AutoCAD来说,任意的一张dwg图纸都是一个数据库,每各dwg数据库都包含了相应的图形数据。如Layer Table就存放了所有图层的数据,Block Table就存放了图块的数据,依次类推。

而对于一个AutoCAD的application而言,就需要读取这个数据库里面的内容,然后将其放置于当前程序占用的内存空间当中。而这个程序在内存空间中的数据结构如下图所示:

一个application包含了Preferences,Documents,MenuBar和MenuGroups。而其中Preferences,MenuBar和MenuGroups是软件设置相关的一些内容,我们平时使用的频率不高。而主要的图形文件都存放在了Documents中。此处Documents的概念就是软件打开的很多dwg图纸。Documents中任意的一个Document就是其中的一个dwg图纸。

我们来看Documents的开发说明

(http://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-2C8C8291-16C9-4A9F-8399-58D5DE4B9589#GUID-2C8C8291-16C9-4A9F-8399-58D5DE4B9589):

它包含Add,Close,Item,Open四个方法,代表说我们可以通过程序新建,关闭,切换和打开dwg图纸。

如下图为用代码打开图纸的过程。

而在CAD中打开dwg图纸获得每个Document后,Document中包含了例如每个所有的模型空间,图纸空间,以及他们当中的图元,图层信息,图块信息等等数据,而这些数据都是可以通过代码获取并进行修改的。

而对于Rhino来说,也有类似的机制能够访问每个3DM文件中的图形数据。Rhino中的RhinoDoc类也是类似于AutoCAD中的Document类的存在。以下就是通过代码打开指定路径下3dm文件的实例。是不是和之前CAD的代码如出一辙?RhinoDoc类中也包含了类似于图层列表,图块列表(referenceInstance),图元列表等等一系列的元素。RhinoDoc类中的详细说明请参考官方的开发文档:

(https://developer.rhino3d.com/api/RhinoCommon/html/T_Rhino_RhinoDoc.htm)

所以从某种程度上来说,AutoCAD和Rhino的数据格式其实是很相似的。接下来,我们就通过几个实际的场景,来对比一下Rhino和AutoCAD之间的开发流程。

4.选择图元

在AutoCAD的ActiveX中,每个Document都包含一个SelectionSets类,这个SelectionSets下有包含很多个SelectionSet。我们可以通过这个SelectionSet来选中我们需要编辑的对象。每个SelectionSet所包含的内容如下:

其中的Select,SelectAtPoint,SelectByPolygon,

SelectOnScreen就是几种选择的方式。以下的代码就是通过Select方法获取对象的实例:

其中的filter和filterData的意义是指筛选图层为S-BEAM-LINE2的直线。关于图元筛选的具体说明详见以下网址:

http://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-4CDE43DD-E3EF-4EF8-B377-4B9ED03E4C96

http://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-6026DE9A-DC00-46D2-938A-6EDCD8670578

获取选择的物体后,遍历selection中的entity就是我们选中的实体,接下来我们就可以修改我们选中的实体了。

在RhinoCommon中选择图元也是类似的操作。下列代码为RhinoCommon选择图元的代码,其中,GetObject就是其中的选择类,通过GetObject设置一定的筛选条件,在通过其中获取物体的方法,就可以实现对物体的选择。

但是,其中的geometryFilter并不能设置图层选项,那么这时,我们就需要通过另外一种方法来通过图层获取图元。

5.创建图元

正如之前所说的,AutoCAD中所有的图元都是放置于一个表中的,我们就可以通过访问表的方式来编辑图纸上的图元。

在AutoCAD中,每个Document都有相应的ModelSpace,这就是我们所谓的图纸空间,ModelSpace提供了很多的方法,让大家可以在其中创建各种各样的图元。大家可以参考如下网址

(http://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-C541B6F2-1279-4D1C-8DC0-788F27F644EF#GUID-C541B6F2-1279-4D1C-8DC0-788F27F644EF),其中提供的方法如下:

我们以创建直线为例。

通过创建相应的点,在通过ModelSpace下的Addxxx方法,我们就可以很简单地在Cad的图纸空间添加相应的图形元素。

同样的,我们也可以获取当前document的layers表,通过layers表的Add方法添加新的图层。

对于Rhino来说,我们也可以通过访问相应的表来创建新的图元。RhinoDoc下有一个Objects的表,里面包含了当前3dm图形文件中的所有图形元素。这个Objects表本身是一个ObjectTable的类,这个类也提供了很多添加图元的方法(https://developer.rhino3d.com/api/RhinoCommon/html/T_Rhino_DocObjects_Tables_ObjectTable.htm)。

我们还是以添加一条直线为例,来通过RhinoCommon在Rhino中创建一条直线:

这个代码和CAD创建直线的方式简直一毛一样。

另外,RhinoDoc中也包含例如图层的LayerTable,我们也可以通过RhinoCommon创建一个Rhino图层。

6.修改图元

当前,我们以及可以创建图元,选择图元,那么,我们要如何修改图元呢?以修改一条创建好的直线的端点为例,在AutoCAD中,我们只需要获取这个Line对象,然后简单地通过重新赋予这个直线地endPoint就可以替换这条直线的端点。

在RhinoCommon中,也可以用同样地方法修改图元的端点:

7.删除图元

在AutoCAD中,任意一个图元都继承自AcadObject类,这个类中都自带有Delete这个方法,我们只需要简单的获取到需要被删除的对象以后,调用这个delete方法,就可以删除这个图元了。代码很简单,只有一行。

在Rhino中,我们则需要通过调用RhinoObjectTable中的delete方法来删除对象。这个delete方法有多种重载:

我们选择其中的一种方式来删除相应的对象。还是就简单的一行代码。

8. 总结

这篇文章中的代码案例其实都很简单,没有编程基础的同学可能也能看个大概。写这篇文章的目的,就是希望帮助大家从二次开发的角度,通过对比去理解这两款软件。其实这两款软件还是很相似的,小编也自认为对这两款软件也有了一定的了解。

AutoCAD以及其配套的工作模式从上个世纪90年代开始就一直霸占国内的建筑设计行业,而Rhino则是2010年前后在建筑设计参数化设计逐渐流行后,慢慢成为了一种趋势。从大家的设计习惯,以及相应的衍生产品的角度上来说,自然目前还是AutoCAD一统天下。从小编这么多年玩这两款软件的感觉来说,Rhino可能还欠缺一些针对建筑设计行业图纸相关的配置,有些诸如图纸管理等等的功能还待开发。但是从图元图素的管理这个角度来说,Rhino的布局是更加灵活的。

首先Rhino基于的是OpenNurbs,图形的表达能力远远强于AutoCAD。其次,Rhino拥有更丰富的API接口,用户可以更加方便地通编程地手段从Rhino中获取自己需要地数据。再次,与Rhino匹配的grasshopper使得Rhino的能力大大增强。用户除了基于RhinoCommon做开发,也可以基于grasshopper做开发。另外,Rhino与AutoCAD的图形数据是完全匹配的,两者可以相互转换。

当然并不是说Rhino就可以完全代替AutoCAD的作用,但是,小编觉得两者可以起到一种共生的关系,获取Rhino图形的快速编辑生成及批量处理的能力,结合AutoCAD在传统设计工作流中的优势,可能也是一种选项。

本文来自网络,不代表钢构人的立场,转载请注明出处。搜索工程类文章,就用钢构人网站。 https://www.ganggouren.com/2020/09/60940b2bf6/

钢结构地图

上一篇
下一篇

作者: ganggouren

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

联系我们

联系我们

17717621528

在线咨询: QQ交谈

邮箱: 1356745727@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部