第2章基本操作本章旨在引导用户熟悉CATIA编程的基本流程和方法。2.1API介绍本节介绍对CATIA进行编程所必须的几个API和一些基本的操作。2.1.1CATIA文档结构(如左图)2.1.2对CATIA进行编程的基本流程(如右图)2.1.3Application对象要对CATIA进行操纵,首先是要连接到它的com接口,在第1章已经讲到过GetObject和CreatObject两种方法,即:DimCATIAAsObject'GetCATIAorLaunchitifnecessary.OnErrorResumeNextSetCATIA=Wscript.GetObject(,CATIA.Application)IfErr.Number0ThenSetCATIA=Wscript.CreateObject(CATIA.Application)CATIA.Visible=TrueEndIfOnErrorGoTo0值得注意的是,在这里CATIA只是一个Object类型的变量,可以使用任何其他的名称作为Application对象。但是在CATIA本身所使用的宏脚本里,CATIA是作为根对象(Application对象)存在的,在程序中使用这个名称使得将来将程序转化为宏脚本或是利用录制的宏脚本时变得非常方便。2.1.4Documents和Document对象获得Application对象后就能对它的文档进行操作。在CATIA中,文档有很多种类型,包括零件(Part)、产品(Product)、工程图(Drawing)等,Documents对象是这几种对象的集合,换句话说,从Documents对象中并不能区分这几种对象。Document对象则不同,它一定是上面几种文档中的一种。当然,不同类型的文档有不同的属性和操作方法。ApplicationionDocumentsCamerasWindowsWindowsPartProduct...Camera2DCamera3DViewsDocumentCamera获取Applicationion对象获取Documents对象获取Cameras对象获取Windows对象缩放、抓屏...获取Camera对象Camera2DCamera3D获取Document对象Part,Product...获取Window对象获取Views对象获取View对象保存、关闭...建模操作对View对象赋值一般可以通过Add方法新加一个文档,如下所示:DimoPartDocAsDocumentSetoPartDoc=CATIA.Documents.Add(“Part”)其中Add方法的参数可以是Part,Product,Drawing三种,分别对应零件文档、产品文档和工程图文档。也可以用open方法打开已经存在的文档,如下所示:DimoPartDocAsDocumentSetoPartDoc=CATIA.Documents.Open(FileName)其中FileName参数必须加上完整的路径。另外,也可以用ActiveDocument属性来获取当前活动的文档,这时要注意加上一定的错误控制,因为CATIA并不一定有当前打开的文档。下面是一段典型的示例代码:OnErrorResumeNextSetoPartDoc=CATIA.ActiveDocumentIfoPartDocIsNothingThenErr.ClearSetoPartDoc=CATIA.Documents.Add(“Part”)EndIfOnErrorGoTo0获取Document对象后,就可以对它进行各种各样的操作,比如保存,另存为,关闭等的。注意,在这里另存为命令不能把文档保存成另一种格式。保存成另一种格式有一个专门的命令ExportData,这一点是和界面命令不同的。以下的示例代码保存文档并关闭:oPartDoc.SaveoPartDoc.Close以下示例代码把当前文档以IGESDoc为名称,在当前目录输出成IGES格式:oPartDoc.ExportData(“IGESDoc”,“igs”)2.1.5Cameras和Camera对象Document对象里储存了文档的视点,像前视图、左视图等,这些视点对象存储在Cameras对象里。当然,这是对零件文档和产品文档来说的,对于工程图则没有这个概念。Cameras和Camera对象的关系就像Documents和Document对象的关系一样,Cameras对象可以包含Camera2D和Camera3D两种Camera对象。可以用Count属性得知当前文档中视点的个数,这其中也包括自定义的视点。以下代码先显示零件文档中的视点个数,再逐一显示它们的名称:DimmyCam3dAsCamera3DMsgBoxoPartDoc.Cameras.CountFori=1TooPartDoc.Cameras.CountSetmyCam3d=oPartDoc.Cameras.Item(i)MsgBoxmyCam3d.NameNextCamera3D对象只有一个属性Viewpoint3D,它可以应用于当前的活动视图,从而改变零件在屏幕上的显示。Camera2D对象应用于二维场景(2Dscence)。2.1.6Windows和Window对象一个零件在CATIA中可以用很多个窗口打开,每个窗口的视角都可以是不同的。Windows对象即指所有打开的窗口的集合,而Window对象则指的是某一特定的窗口,这两者之间的关系就如Documents和Document对象的关系一样。如下示例代码先显示当前打开的窗口个数,然后逐个激活并显示它们的名称:DimmyWindowAsWindowMsgBoxCATIA.Windows.CountForEachmyWindowInCATIA.WindowsmyWindow.ActivateMsgBoxmyWindow.NameNext这一段代码和上面一段遍历Cameras对象的代码是一样的,但这里使用了ForEach的结构。在集合中的元数个数变化时(如用Close方法关闭特定的窗口),这种语法结构显然更加简洁和强壮。Windows对象还有一个更常用的属性即ActiveWindow属性,它指当前的活动窗口。2.1.7Viewers和Viewer对象有了上面这么多集合对象和实例对象的例子,读者应该很清楚这两者之间的关系了。Viewer对象一般只有一个,它是Window对象的一个属性。一般用Window.ActiveViewer就可以获取它了。Viewer对象有很多有用的方法,如Reframe、ZoomeIn、ZoomOut等。如下代码先放大视图,再缩小视图,最后重组视图。DimmyViewerAsViewer3DSetmyViewer=CATIA.AtiveWindow.ActiveViewermyViewer.ZoomInmyViewer.ZoomOutmyViewer.ReframemyViewer.Update没错,最后要用update方法更新视图。Viewer对象还有一个比较有趣的功能是能把屏幕抓下来保存成图像,如下所示:DimMyViewerAsViewer3DMyViewer=CATIA.ActiveWindow.ActiveViewerMyViewer.CaptureToFilecatCaptureFormatBMP,“c:\MyImage.bmp”当然,也可以转到任何一个标准视图,如前视图:DimmyCam3dAsCamera3DDimmyViewerAsViewer3DSetmyCam3d=oPartDoc.Cameras.Item(*front)SetmyViewer=CATIAActiveWindow.ActiveViewermyViewer.Viewpoint3D=myCam3d.viewpoint3DmyViewer.Update也可以遍历当前的Cameras对象,并把它们置为当前视图。下一节就会讲到。2.2文件及视图操作实例本节通过实例说明如何打开、关闭文档及进行视图操作。2.2.1本实例实现的功能1.使用通用文件对话框打开文件;2.对所打开文件进行视图操作;3.保存并关闭文件。该实例在“\光盘\02-基础操作\02-文件和视图操作”目录中。2.2.2启动时的动作PrivateSubForm_Load()Me.MoveScreen.Width-Me.Width,Screen.Height-Me.HeightMakeMeOnTopMe.hwndEndSub这段代码在窗体加载时执行,它先把窗口移到屏幕右下角,再用MakeMeOnTop这个函数把当前窗口置于其他窗口前面。由于窗口不大,移到右下角后不会遮住CATIA的图形窗口,而且有置顶的属性,即使在CATIA中做操作也不会让窗口沉到下面去,它的行为就像是CATIA本身的一个工具条。2.2.3打开文档程序中加了一个通用文件对话框,用命令按钮来调用这个通用对话框,用于打开CATIA文档。PrivateSubcmdOpen_Cick()OnErrorResumeNext首先加上一个错误控制,它指明如果程序发生错误则不理会继续往下执行。这是因为通用对话框是由用户来选择文件的,用户若选择了一个不存在的文件或取消了操作则程序会产生一个取消错误,这段代码抑制了这个错误。CommonDialog1.Filter=零件文件|*.CATPartCommonDialog1.ShowSave这里设定了通用的打开对话框的过滤器属性,因为接下来的视图操作是针对零件文档的,因此这里只允许打开零件文件,然后程序用ShowOpen方法显示了通用的打开对话框。一般在显示这个窗口前还应该把它的FileName属性置空。IfCommonDialog1.FileNameThenInitCATIAPartFalse,CommonDialog1.FileNameEndIfOnErrorGoTo0这段程序先判断通用对话框是否返回一个空的文件名(用户选择取消时发生),再用Documents的Open方法打开文档。最后程序取消错误控制。一般应该在最小范围内使用错误控制代码,这样当程序发生错误时调试器会告诉你那里发生了错误,是什么错误。2.2.4视图操作PrivateSubcmdViewer_Click()DimmyViewerAsViewer3D'获得当前活动视图SetmyViewer=CATIA.ActiveWindow.ActiveViewermyViewer.RenderingMode=catRenderShading定义活动视图对象,并修改当前的渲染模式。注意,程序最前面定义了强制变量声明,因此每个变量都必须声明,如果想偷懒的话可以只写DimmyViewer把它定义为变体类型。至于渲染模式常数则在代码键入的时候VB的自动完成功能会列出所有的选项供你选择。'摄像机总数MsgBoxoPartDoc.Cameras.Count用提示对话框显示文档中的摄像机总数,可以加上一些提示信息,如“文档中共有X个'扫描所有的摄像机DimiAsIntegerDimmyCam3dAsCamera3DFori=1TooPartDoc.Cameras.Count使用For循环遍历所有摄像机,也可以使用ForEach结构。SetmyCam3d=oPartDoc.Cameras.Item(i)用Item属性获取集合中的对象,所有的集合对象中的元素都能通过这种方式访问。'改变当前的活动视图myViewer.Viewpoint3D=myCam3d.Viewpoint3D这里不用使用Set.因为这是对象属性的赋值。myViewer.ReframemyViewer.ZoomInmyViewer.UpdateMsgBoxmyCam3d.NameNextEndSub一般应该先取得集合中元数的个数井保存到一个变量当中,再用这个变量作为循环的参数遍历集合。这个变量就像是去超市购物的收据,因为循环过程中集