1. 引言
现代制造业中,计算机辅助技术是以计算机为工具,协助人们完成任务管理、决策等各项工作的技术[1],其设计软件被广泛应用于产品设计与开发,其中就包括Solidworks和NX,两者具有各自独特的功能和优势。在实际生产和学习中,常常需要在不同软件之间进行模型数据的转换与共享,但是由于当下主流的商业化CAD系统对模型特征的描述以及构建都存在着差异。传统的数据转换方式,如通过IGES、STEP等中间格式,常常会出现模型的几何信息丢失、特征映射错误、装配体结构错乱、参数单位不一致、逻辑不兼容等问题,导致模型的精度下降,影响后续的加工和分析,这就可能需要大量的时间和精力进行手动修复和调整,大大降低了工作效率。因此,从构成零件的基本特征单元出发,有效地从Solidworks模型中提取几何特征信息,并在NX中准确地重建模型,成为了跨软件平台三维建模与设计中亟待解决的关键问题。从技术层面来看,Solidworks具有强大的扩展性,其内部封装了大量的API接口[2],支持特征树遍历、参数驱动及几何拓扑分析,NX也建立了供用户定制功能的二次开发平台,提供了各种开发工具、接口和解决方案[3]。另外,VB是目前Windows平台下最优秀的开发工具之一,开发周期短、代码效率高[4]。因此,可以考虑将Solidworks与NX结合,并基于VB的跨平台开发框架,建立起更合适的转换通道。
2. 系统框架与实现流程
2.1. 系统框架
Figure 1. System framework
图1. 系统框架
本文依托三维软件Solidworks 2024和NX 10,将VB.NET作为本方法的开发语言,结合两个软件的API接口提供的函数,编写符合需求的功能代码来进行二次开发,图1即为本方法的系统框架。首先以导入的Solidworks文件作为切入对象,通过编程提取有效的几何特征参数,再完整存储到文本文件并进行解析,最后在NX软件中实现重建。
2.2. 参数提取
Solidworks具有强大的参数化建模功能,能够快速、简洁地完成各种产品结构的设计,从而满足设计师的需求[5],并且由于内部的API所采取的方式是面向对象,包括了所有的数据模型,为使用群体提供了面向对象的体系,从而可以更加有效地访问到软件数据库。为获得编程软件与Solidworks 2024建模软件的耦合[6],还需要预先添加“SldWorks 2024 Type Library”等引用,完成环境搭建工作。
从模型的历史创建顺序出发可以最大程度还原模型特征,借助GetTypeName2方法逐一得到特征树中的特征对象。但由于特征对象含有多种类型,为了将包括历史记录、传感器以及注解等在内的无关特征对象去除,还需要建立一个筛选函数实现特征条件的过滤。如此一来,最终得到的如“Shell”(抽壳)、“Fillet”(圆角)、“Chamfer”(倒角)等才是后续进一步提取几何信息所真正需要的对象。将Solidworks模型导入后,从获取到第一个特征开始,就经筛选函数识别是否为有效特征,结合GetNextFeature继续搜寻,以是否存在子特征为标志,将得到的有效特征分成两类:非独立特征(具有子特征的父特征)和独立特征,其中,非独立特征决定了模型的总体形状,而独立特征起到了对前者局部进行深层次修饰的作用。如此循环,直至遍历完加载的模型,这部分的实现过程如图2所示。
Figure 2. Extraction process of feature parameters
图2. 提取特征参数流程
在分类得到正确的对象之后,从Solidworks的特征设置界面出发,进入到提取几何参数的关键环节。考虑到特征类型数目的多样性,可以结合策略模式将不同类型的特征处理逻辑封装到独立的策略类,再通过统一的字典根据判断的特征类型名称,动态匹配调用对应的提取参数策略。后续新增特征类型时,也只要添加新的策略类并注册到字典中,无需修改原有代码。
以图3中的拉伸特征为例,当程序识别到该特征时,调用相应的New Extrusion Strategy函数。在该策略类中,所需提取的参数依据图中左侧的参数设置界面分为3大类,包括起始条件类型(从F)、拉伸数目(单向、双向)以及薄壁特征,对于其中的拉伸数目类型,又进一步细分为终止类型(给定深度、成形到顶点、两侧对称等)和拔模开关。另外,需要注意的是,包括拉伸在内的许多特征类型,很多参数信息返回的结果会是整数类型,那么就需要将其转换为字符类型,以确保后续在解析参数时,NX能够正常调用。
Figure 3. Stretch feature setting interface
图3. 拉伸特征设置界面
2.3. 存储参数
为便于后续读取参数的顺利进行,在完成Solidworks几何特征参数的提取后,建议按照统一的格式结构化存储在文本文件中,如下图4即为某Solidworks模型提取参数后得到的部分文本内容。从图中可以看出,文本参数根据2.2中的分类原则采用树状结构来组织,具体涵盖一个拉伸特征和一个圆角特征。在这种结构中,每个节点代表一个特征,并且包含该特征的类型和相关参数。其中,“非独立特征”下的“凸台–拉伸1”作为一个父特征,其类型为“Extrusion”,“ProfileFeature”类型的“草图1”是它的子特征,而“圆角1”特征由于不依赖子特征存在,故属于分类原则中的独立特征,各自的参数均在其后详细列出。通过这种直观的方式表示特征之间的层次关系,不仅容易反映出特征之间的依赖性和关联性,而且可以确保在读取数据时的可靠性。
Figure 4. Feature parameter storage text style
图4. 特征参数存储文本样式
2.4. 解析参数
参数的解析是一个关键步骤,它涉及从上述文本文件中提取重建模型的重要几何特征信息,故可以通过定义一个如下的类来存储特征类型及其参数。通过逐行解析文本的方式,将文本中的“父(子)特征名字”、“父(子)特征参数”等作为标志准确提取信息,并填充到以下的FeatureInfo的实例中。
Public Class FeatureInfo
Public Name As String ’特征名称
Public FeatureType As String ’特征类型
Public Parameters As New Dictionary (Of String, String) ’特征参数
Public SubFeatures As New List (Of FeatureInfo) ’子特征列表
End Class
2.5. 模型重建
特征参数获取完毕后,按照先子特征再父特征的创建原则编写一个递归函数,分别在Case subFeature.FeatureType和Case feature.FeatureType中顺次地对应处理子特征和父特征,并且在各类型下均需要有对应特征类型的具体执行函数,以达到最终实现在NX中重建模型的目的。如下即为程序识别到某特征为草图类型时,所需要执行的操作代码。
Dim sketchFeature As NXOpen.Features.Feature = CreateSketchFeature (part, subFeature.Parameters)
part.Features.Add (sketchFeature)
3. 案例研究
3.1. 拉伸特征
以图5所示的模型为例,其中包含“凸台–拉伸10”(玫红色区域)等在内的多个拉伸特征,接下来将围绕其从Solidworks到NX转换的部分步骤进行展开介绍。
由于“凸台–拉伸10”属于非独立特征,故所需提取的参数自然就将分为父特征和子特征两类。通过查阅官方的帮助手册,得到拉伸特征参数信息的关键接口是IExtrudeFeatureData2 Interface,它为访问拉伸参数提供了一系列的方法和属性。第一步,提取父特征信息。当程序识别出该类型为“Extrusion”(拉伸)时,首先,结合FromType方法得到该特征的拉伸起始类型为“曲面/面/基准面”,为了确保在NX软件中重建该特征时可以准确定位到该面,还需要进一步补充详细条件。基于参考面(图示橙黄色区域)是“凸台–拉伸1”的一个平面,故本文所采取的措施是提取该面的其他有效信息,综合利用包括Face.GetBody、Face.GetArea以及Edge.GetStartVertex、Edge.GetEndVertex在内的方法来获得参考面的所属体、参考面的面积和参考面的边界点坐标,最终唯一确定参考对象。接着,通过BothDirections返回的布尔结果判定该特征只存在单向拉伸,而后进一步借助GetEndCondition得到终止类型,由于图示特征为“给定深度”,自然又需要使用GetDepth方法获得具体数值,并在GetDraftAngle以及GetDraftOutward等方法的使用下得到拔模的具体数据。最后,配合着IsThinFeature等有关薄壁的方法获取完整信息。
第二步,提取子特征信息。由于子特征类型为草图特征,于是进入对应的特征模块,分为草图的基准面信息以及草图元素两部分进行提取。一方面,借助Sketch.GetReferenceEntity方法得到草图基准面类型,并进一步通过相关属性和方法获取基准面具体信息。另一方面,通过GetSketchSegments方法循环遍历得到的草图中的所有元素,并根据元素类型(如圆、圆弧、直线、椭圆等)提取必要的几何信息,然后将这些信息写入到输出文件中。值得注意的是,对于不同草图元素类型所需要包含的信息是不相同的。例如,直线类型只需要提取起点以及终点,而圆弧类型除了起点和终点外,还需要提取半径和圆心等必要信息。因此,针对不同的草图元素类型,使用Case语句进行分类提取有效信息是很有必要的。
Figure 5. Contains multiple stretching feature models
图5. 含多个拉伸特征模型
参数提取完毕之后,接下来进入到解析参数以及模型重建部分。由于在参数文本中得到的类型包括父特征“Extrusion”和子特征“ProfileFeature”,那么在NX中就需要分别启用ExtrudeBuilder以及SketchInPlaceBuilder两种构造器重建模型。以下为“凸台–拉伸10”特征在NX软件中还原的关键步骤:
(1) 新建草图。由于草图平面是“凸台–拉伸1”的一个平面,这属于现有平面,故需要将PlaneOption设置为ExistingPlane。而后根据读取到的参考面所属体、参考面的面积以及参考面的其它信息,逐步缩小搜寻范围,最终得到准确目标对象,图6为在搜索目标面的过程中所提取到的部分参数信息,通过将信息与目标面进行比对,最终确定唯一目标对象,查找过程的关键代码如下。
Dim bodyName As String = GetBodyName (body,workPart) ’检查体名称
Dim faceArea As Double = GetFaceArea (face, Part) ’检查面积
Dim boundaryPoints As List(Of NXOpen.Point3d) = GetFacePoints (face) ’检查边界点
Figure 6. Search target surface process
图6. 搜索目标面过程
(2) 补充草图元素。为了更好地组织和存储草图中的几何元素,需要创建一个列表SketchGeometries用于存储读取到的草图内容,以供后续选取用于创建特征的曲线调用。
(3) 拉伸操作。首先是选取拉伸的曲线,针对“凸台–拉伸10”这一特征,采取的办法是通过CreateSection方法创建截面容器并设置几何连接公差,随后动态获取草图特征中的曲线元素,通过CurveFeatureRule规则定义选择逻辑,使用AddToSection方法将草图中的曲线批量添加到界面中。然后是设置拉伸的限制类型,需要将开始类型ExtendType设置为UntilSelected,即“直至选定”,并进一步将选定的对象确定为上述所提到的参考面对象,同时将结束类型根据提取到的文本内容设置成Value。最后,通过Draft和Offset中提供的众多方法以及属性分别来设置详细的拔模和偏置(薄壁)参数。
3.2. 扫描特征
扫描特征是CAD模型中用于创建复杂形状的一种重要工具,它通过沿指定路径拉伸或旋转一个轮廓(截面)来生成三维特征,在Solidworks和NX中都广泛使用,但实现细节可能有所不同。本节将以图7中所示的“扫描–薄件1”特征作为案例,对特征转换的部分操作进行介绍。
Figure 7. Including scanning feature model
图7. 含扫描特征模型
Figure 8. NX pipeline feature setting interface
图8. NX管道特征设置界面
提取Solidworks模型的扫描特征信息,需要使用ISweepFeatureData Interface接口。首先,通过CircularProfile方法返回的布尔结果,得到轮廓类型是圆形,在这种情况下,由于不存在引导线、起始处和结束处相切的参数类型的设置,因此也就无需再获得上述类型对应的参数信息。接着,分别调用Path和CircularProfileDiameter方法得到路径名称和圆形轮廓的直径。最后,利用ThinFeature方法判断特征是否启用了薄壁选项,并视具体情况使用GetWallThickness得到薄壁厚度尺寸及薄壁方向信息。通过上述方法,得到“扫描–薄件1”特征的圆形轮廓直径为8.150 mm,薄壁单向朝内1 mm。
在NX中启用TubeBuilder管理器对“扫描–薄件1”的特征进行重建。与Solidworks软件不同,扫掠分类下的管道特征不存在薄壁选项,如图8所示,需要通过横截面选项中的外径和内径数值来间接设置。由于特征中存在薄壁设置,为与Solidworks中的“扫描–薄件1”保持一致,需要将内径设置成读取到的圆形轮廓直径,即8.150 mm,而外径则需要根据读取的文本参数进行简单换算,设置为8.150 − 2 × 1 = 6.150 mm。
3.3. 细节补充
由于Solidworks与NX是两个完全不同的三维建模软件,它们在内核架构、数据结构、特征定义、用户界面以及编程接口等诸多方面存在着显著差异。因此,在转化模型过程中,需要注意一些问题。
(1) 映射转换的问题。以偏置和拔模的功能为例,在Solidworks软件中的数值大小为正数,单独设有控件设置方向,但在NX软件对应功能的设置中,却是通过给定数值的正负性来间接设定方向。因此,在提取参数及识别参数环节有必要进行特殊处理。再如Solidworks中的扫描这一特征,但在 NX 10中的标准命名为“扫掠”,而且进一步细分为了扫掠、样式扫掠、截面、变化扫掠、沿引导线扫掠以及管道功能,如图9所示,这些操作又对应着不同的参数类型。
Figure 9. NX10 sweeping features
图9. NX10扫掠特征
(2) 功能实现的差异。在3.1节中提到,为获得一个面的面积,Solidworks 2024软件可以直接使用Face.GetArea方法得到,但对于NX 10软件而言,却无法通过直接的方法得到指定面的面积属性。通过查阅官方文档,以下将列举出两例间接获得面积的方式。一个是AskMassProps3d方法,它的输出参数mass_props [0]就可以得到计算片体的表面积。因此,需要先借助AskBodyFaces方法从实体找到对应的所有面,并使用ExtractFace方法从实体中抽离出一系列面,形成片体集合,最终才能顺利得到实体的各面的面积,另外最后还需要删除临时创建的片体,该方法的部分求解代码如图10所示。另一个方法是通过软件本身的录制功能找到,它的主要思路是获取所有体的每一个面,再创建一个MeasureFaceBuilder构建器,定义其规则为简单面选择,最后使用测量管理器创建面属性测量对象(MeasureFaces)得出面积,部分关键代码如图11所示。将上述两种方法进行对比,不难发现,AskMassProps3d需手动管理中间几何体,通过质量属性间接计算面积,既冗余又易出错,而MeasureFaces的方法比AskMassProps3d更优,无需处理临时几何体和复杂数组,专用面测量API支持精度控制,且支持NX高级选择规则,这也正是在3.1中求解面积使用到第二种方法的原因。
Figure 10. Area solving process based on AskMassProps3d
图10. 基于AskMassProps3d的面积求解过程
Figure 11. Area solving process based on MeasureFaces
图11. 基于MeasureFaces的面积求解过程
4. 结语
对特征信息的全面有效提取,以及正确地处理转换过程中的映射问题,是实现模型重建的关键技术。本文在使用Solidworks和NX的API接口的基础上,利用VB进行二次开发,调用提取在文本文件中的几何特征信息以重建模型,较好地解决了模型在Solidworks与NX两个软件之间的转换问题。如果在此基础上对方法进行完善,例如,扩展更多的特征策略类型,同时提取零件之间的约束和配合等关系,那么本方法就不仅适用于简单的零件模型,对于复杂装配体也会同样适用。总的来说,本文提出的方法为不同三维软件之间的模型转换提供了思路,具有一定的借鉴意义。