资源预览内容
第1页 / 共39页
第2页 / 共39页
第3页 / 共39页
第4页 / 共39页
第5页 / 共39页
第6页 / 共39页
第7页 / 共39页
第8页 / 共39页
第9页 / 共39页
第10页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第十八章 ACIS的实例代码 l18.1 用Scheme语言生成ACIS程序l18.2 用Windows控制台环境编译ACIS程 序l18.3 用ACIS AppWizard生成应用程序框 架18.1 用Scheme语言生成ACIS 程序lACIS从实用角度而言(不准确地说), 是一个大型的专门用于几何造型的类库, 而它的运行环境正如上一章所述,是 Scheme和C+;本章将就ACIS的 Scheme程序、C+的Windows控制台程 序和C+的AppWizard应用程序,进行实 例讲解。用Scheme语言生成ACIS程 序 l本节主要介绍Scheme语言的使用规则, 简要讲解其基本概念如表达式、变量、函 数、简单几何造型功能等,并附有可以直 接运行的例程代码。 Scheme语言基础语法lACIS中的Scheme解释器是用C+设计的,ACIS中的几 何造型功能通过对标准Scheme命令的扩展实现,这些 扩展命令也是用C+设计的,它们支持ACIS中的高级造 型功能,如模型着色和零件管理功能。l 与C+相比,Scheme是一种快速程序设计语言,而且 简洁易学。Scheme语言的语法规则很少,总结如下:l通过交互地调用Scheme过程来执行程序;lScheme过程及其参数都被包含在一对圆括号里;l圆括号里的部分被称为Scheme表达式;l表达式中包含过程名称和过程参数,具体格式如下:l(过程名称参数1,参数2,)l分号“;”引导的部分为程序注释。l(如何运行ACIS Scheme解释器,请参看17.3.1节)表达式l由于Scheme是一种解释型的程序开发语言,其表达式只能在解释 器中执行。运行ACIS的Scheme AIDE解释程序后,就可以在它的 “acis”提示符下输入表达式,在表达式的结束处按回车就可以执 行该表达式。以下是几个典型的算术表达式:lacis输入:(* 5 6)l回车输出:30lacis(* 5 6 7)l210l在Scheme的表达式中,操作符(如*)后面可以跟任意多个参数, 但是其间一定要用空格隔开;并且一个表达式里可以包含一个或 者多个表达式,如:lacis(*(+ 1 2)(* 5 6)l90l理论上,表达式之间互相嵌套的层数是没有限制的,程 序员只要匹配好括号就行了。l上面表达式的例子中使用了两个标准的Scheme内部过 程进行乘法和加法运算,而ACIS Scheme还扩充了 ACIS造型器专用的过程,用户可以按照上述标准 Scheme过程方法调用这些造型过程,如下面命令可产 生立方体:lacis输入:(solid:block(position 0 0 0)( position 10 10 10)l回车输出:#entity 1 0l上述命令产生了一个正方体,如图17.1.1,共调用了两 个ACIS Scheme过程(position和solid:block), #entity 1 0是该正方体的默认名称。外部描述符lScheme表达式产生的每个对象都有一个 外部描述符和一个内部描述符。虽然外部 描述符看上去比较简单,它在与用户交互 过程中有重要作用。它会将一个过程的执 行结果反馈给用户,例如我们前面举的一 些例子中,如果表达式的计算结果不被用 作其他表达式的参数,也就是说该表达式 未被嵌套在其他表达式中,则Scheme解 释器自动将表达式执行结果的外部描述符 输出,对于算术运算来说其外部描述符只 是一些简单的数字,如30,210,90等。lACIS的对象也具有外部描述符,当一个 含有ACIS造型功能的过程被调用后,它 所产生的ACIS对象的描述符就会被解释 器输出,其一般格式如下: l#type_of_objectl下面,我们看一个关于ACIS对象的例子 : l;产生一个position对象lacis(position 10,20,30)l#position 10,20,30l这个position对象的外部描述符表示了一 个x=10,y=20,z=30的坐标点。l从ACIS的ENTITY类派生的对象的外部描 述符与position对象的外部描述符类似, 稍微复杂之处就是,这些东西被组织到所 谓的零件(PART)单元中。在ACIS Scheme解释器开始运行时,它会自动产 生一个编号为1的默认零件。下面就是关 于ACIS的ENTITY对象的Scheme例子:l;产生一个长方体 lacis(solid:block(position 0 0 0)( position 10 10 10)l#entity 1 0l过程solid:block产生了一个ACIS实体对 象,#entity 1 0是它的外部描述符,该描 述符由两部分组成,即实体号(1)和零 件号(0),实体号可以作为其他过程的 参数。下面就是一个使用实体号的例子:l;删除一个实体 lacis(entity:delete(entity 1)l() l注意:“()”表示空元素,Scheme语言 的列表结构中会自动地在列表末尾增加它 。 变量l在Scheme语言中可以用变量名称记录变量的数值,如17.1.1节中的例子所示,一个 过程的返回值,如果不保存在一个变量中,没有多大用途。Scheme语言中的变量 和过程都可以用一个符号表示,定义变量和过程的操作符是define,它可以命名一 个表达式,语法如下:l(define名称表达式)l下面是两个变量定义的例子:l;定义数值变量placis(define p(* 10 10 10)lplacisp ;调用变量pl1000l;定义ACIS变量p1lacis(define p1(position 10 10 10)lp1lacisp1 ;调用变量p1l#position 10 10 10l上述例子中p是一个数值变量,p1是一个position对象变量。函数lScheme语言中的函数定义也是通过define命令实现的 ,语法如下所示。在这个例子中,函数参数x是一个局 部变量,即只有在定义它的函数中有意义。l;定义函数“square”lacis(defiine (square x)(* x x)lsquarelacis(square 6)l36l用define命令产生的函数以及变量是全局性的,对于一 些简单的任务(用30到50行程序即可以完成的任务), 完全可以使用这个命令进行处理。而从程序的可读性和 避免变量名的冲突来说,还需要其他一些更复杂的处理 。Scheme中的读写操作l在ACIS Scheme解释器里进行SAT文件的读写操作要比 C+中的操作简单得多,下面就是一个完整的SAT文件 的读写过程:l;产生一个BODY对象l(solid: block (position 0 0 0)(position 10 10 10)l;将它保存到save.sat文件中l(part: save “E:/save.sat”)l;将BODY删除l(part: clear)l;从文件save.sat中读入刚保存的实体l(part: load “E:/save.sat”)用Scheme产生基本几何体l用ACIS Scheme可以很快捷地产生基本几何体,如,在ACIS Scheme解释器里输入如下命令就可以产生一个球体:lacis(view: gl) ;生成一个视图窗口lacis(solid: sphere(position(0 0 0 ) 20)l#entity 1 1 ;零件0中的第一个实体l下面是几个产生基本几何体的函数: lsolid: block (position 左下角顶点坐标) (position 右上角顶点坐标) ;立方体lsolid: sphere (position 圆心坐标) 半径 ;球体lsolid:cylinder (position下圆心坐标) (position上圆心坐标) 20 ;圆柱体lsolid: cone (position 下圆心坐标) (position 顶点坐标) 25 0 ;圆锥体ACIS Scheme中的集合运算lACIS Scheme中的集合运算与C+中的集合运算基本一样,惟一不 同的是它可以将多个实体一起进行运算,这要比C+中的一次只能 计算两个实体方便。下面是一个例子,为了与C+进行比较,这里 仍然对两个圆柱进行求并运算。l;两个正交的圆柱l(define c1 (solid:cylinder (position 0 0 -50) (position 0 0 50) 20)l(define c2 (solid:cylinder (position 0 0 -50) (position 0 0 50) 20)l;t1是将实体沿与x轴垂直的方向旋转90度的函数l(define t1 (transform: rotation (position 0 0 0) (gvector 1 0 0) 90) l(entity: transform c1 t1) ;把c1旋转90度l(define cross (solid: unite c1 c2) ;c1和c2两个圆柱将被删除ACIS Scheme中的布尔运算lACIS Scheme中提供了强大的布尔运算功能,不仅有效实体之间可以进行 布尔运算,其他的一些几何实体之间也可以进行布尔运算。下面是一个平 面与双圆锥体之间的布尔运算: l;生成两个顶点重合的圆锥,即顶对顶,并将它们进行求并运算,然后将 其结果与一个平面进行差运算 l(define c1 (solid: cone (position 40 0 0) (position 0 0 0) 25 0) ;产 生圆锥c1l(define c2 (solid: cone (position -40 0 0) (position 0 0 0) 25 0) ; 产生圆锥c2l(define c3 (solid: unite c1 c2) ;求并l(define plane(face:plane (position -100 100 5) 200 200 (gvector 0 0 -1) ;产生平面planel(define cut(sheet: face plane) ;生成平面片l(bool: subtract c3 cut) ;求差l在上述例子中为了在一个三维实体和一个二维平面片之间进行布尔差运算 ,没有使用适用于三维实体的solid:subtract函数,而是使用了更通用的 bool:subtract函数。Scheme语言总结l一个完整的Scheme程序由表达式和定义组成。这里,我们总结一下Scheme语言中的定义格式。l定义可以出现在程序的顶部,这时的定义被称为声明。定义也可以作为一个主程序的开始,如一个函数或者过 程的开始。定义的格式有如下4种:l(1)(define变量表达式),这是一种基本定义格式,一般变量的定义就是这种格式;l(2)(define(变量形式参数程序体),如定义局部函数的lambda语句就是这种定义格式,下 面计算阶乘的数值函数的定义就采用了这种定义方式:l(define factorial(lambda(num)l(if(= num 0)1(* num(factorial(- num 1)
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号