我的同事梁晓冬最近一年对Navisworks的支持工作产生了极高的热情,我想可能是国内对Navisworks关注/使用的用户越来越多吧。前些天我叫他写了一篇针对Navisworks初学者或者希望更进一步了解Navisworks的用户的技术类的介绍性文章。现在我把他的文章转贴在下面供大家学习: NavisWorks 是目前Autodesk 在建筑业表现最突出的一款施工项目管理产品,它将带您进入具有巨大商机的建筑业施工管理行业,而掌握其API将为您提供基于 NavisWorks集成创新的工具,使您能够成为行业的领跑者。 Navisworks将原始模型数据转换成逻辑数据和全局数据两种类型。逻辑数据是将原始的逻辑结构转换到Navisworks场景中,它呈现出一种继承(树状)结构。全局数据是为了实现模型的快速优化显示。一般逻辑数据发生变化,全局数据将自动重建。 逻辑数据
我们以DWG文件为例。下图是一个简单的DWG在Navisworks中打开后的样子。有两列实体,分别在图层0和图层1上。左边的选择树(Selection Tree)面板中,顶层是文件test.dwg, 接着是0层,1层,在每一层放置了对应的实体。简单实体转换成对应的类型,例如圆à圆,文字à文字。复杂实体,例如块,被转换成 : 块实体à块定义à块定义中的实体。熟悉AutoCAD及其API的用户可以看出,这体现的是和AutoCAD类似的逻辑结构。 以上示例经过抽象化,就如下图的树形结构。树上的每个元素是节点,从根节点开始直到最后节点的分支就是一条路径。每个路径是唯一的,末梢节点是几何元素。 Navisworks 的API提供了相应的对象来操作逻辑数据。开发包的例子ACTX_06展示了如何遍历逻辑结构树和访问节点属性信息。 API 对象
| 说 明
| InwOaPatition
| 顶层对象,根节点,存储文件基本信息,材料以及全局转换矩阵
| InwOaPath
| 路径对象,可访问其中的每个节点
| InwOaNode
| 节点对象,可为组节点(图层或insert),几何节点,并存储对应的属性信息
|
全局数据
当原始数据转换成全局数据时,被离散为很多碎片(Fragments)。 Navisworks根据其算法来灵活使用这些碎片,达到显示和速度上的最优化。一个原始实体将可能产生多个碎片。例如:它拥有多个材料,那么每个材料就生成一个碎片。即使在上面DWG例子中一个简单的圆,在转换后也会有两个碎片,分别对应其捕捉点和具体几何数据。全局数据对最终用户来说是不可见的。 碎片的API对象是InwOaFragment,它存储了碎片的转换矩阵,碎片所在的路径等信息。Navisworks没有保留原始的几何信息,不过要访问Navisworks场景中的几何数据,可以用碎片的GenerateSimplePrimitives方法。该方法需要传入回调类InwSimplePrimitivesCB,它提供了顶点,三角面片,线元等数据。 属性由于Navisworks有着自己的数据结构,原始的数据大部分会被转换成属性(Attribute)。每个节点会存储多个属性,形成属性集合。而如果是特性属性则会包含多个特性(Property)。这些属性存储在节点InwOaNode之中。属性有很多种类,例如材料信息,变换矩阵信息等。它对于对于最终用户是不可见的,而且目前不能创建/删除/修改属性。 每个属性有三个名字。通过这些名字,我们可以用Navisworks查找方面的API去搜素相应的属性及其内容。请参考开发包例子ACTX_05。 名字
| 说 明
| ClassUserName
| 用户定义的名字。随不同语言版本而不同(只读)
| ClassName
| 所有版本都相同,唯一标识属性的名字(只读)
| UserName
| 可选的名字(读写)
|
Navisworks还有GUI 属性,它对应用户界面的properties。每个对象存储的GUI属性大部分和上面提到的属性一样。但最终用户能够看到。而且无论UI还是API都可以添加自定义的GUI属性。但需要注意,如果是由Navisworks转换原始数据创建的GUI属性,例如下图中的项目(Item)选项卡,UI或API都不能对它进行修改或删除。开发包实例AUTO_06演示了如何操作GUI属性。
对象的ID
很多用户会关心标识对象的ID,也有人注意到Navisworks的任何对象都有一个成员: nwID,实际上它代表的是底层的C++指针,每次启动Navisworks时将会变化。因此它不能作为ID。我们已经提交了一个需求,希望开发部能给对象提供唯一的ID。不过目前也不是毫无办法,其实, Navisworks转换DWG文件会把每个实体的句柄变成一个属性(ClassName: LcOaNat64AttributeValue)。如果是Micorstation (DGN)文件,则转换名为"Element"的属性,如果是ArchiCAD文件,则名为GUID。在UI的properties面板也可以看到。因此,你可以根据文件类型来找寻对应的属性,获取ID。 选择集
和大多数CAD软件开发一样,用户经常需要选择集(InwOpSelection)。 通过选择集,我们可以访问到其中包含的路径,节点等信息,进行操作。若最终用户选择了一些实体,API 最顶层对象state的成员CurrentSelection将返回这个选择集。也可以通过API来构造选择集,一个方法是InwOpState::SeekSelection,它传入回调函数类:InwSeekSelection,在这个类方法SelectNode中,按照你设置的条件来构成选择集。另一方法是利用查找方面的API,通过设置属性/特性的条件搜索到一个选择集,请查阅开发包例子ACTX_05。 一个选择集如果有了名字,则成为SelectionSet (InwOpSelectionSet)。文件刚转换到Navisworks中是没有SelectionSet的,用户界面也不会显示SelectionSet面板。一旦有了某个SelectionSet,你就可以看到这个面板。
综上所述,对Navisworks模型数据的开发主要围绕对逻辑数据,全局数据,属性的操作。具体的信息请参阅开发包的帮助文档以及样例。更多关于Navisworks介绍,请访问:
文章来源:http://blog.csdn.net/barbarahan/article/details/4864519
|