《第十八章ACIS的实例代码》由会员分享,可在线阅读,更多相关《第十八章ACIS的实例代码(39页珍藏版)》请在金锄头文库上搜索。
1、第十八章第十八章 ACIS的实例代码的实例代码 l l18.1 用Scheme语言生成ACIS程序l l18.2 用Windows控制台环境编译ACIS程序l l18.3 用ACIS AppWizard生成应用程序框架18.1 用用Scheme语言生成语言生成ACIS程序程序l lACIS从实用角度而言(不准确地说),是一个大型的专门用于几何造型的类库,而它的运行环境正如上一章所述,是Scheme和C+;本章将就ACIS的Scheme程序、C+的Windows控制台程序和C+的AppWizard应用程序,进行实例讲解。用用Scheme语言生成语言生成ACIS程序程序 l l本节主要介绍Sche
2、me语言的使用规则,简要讲解其基本概念如表达式、变量、函数、简单几何造型功能等,并附有可以直接运行的例程代码。 Scheme语言基础语法语言基础语法l lACISACIS中的中的SchemeScheme解释器是用解释器是用C+C+设计的,设计的,ACISACIS中的几何中的几何造型功能通过对标准造型功能通过对标准SchemeScheme命令的扩展实现,这些扩展命令的扩展实现,这些扩展命令也是用命令也是用C+C+设计的,它们支持设计的,它们支持ACISACIS中的高级造型功能,中的高级造型功能,如模型着色和零件管理功能。如模型着色和零件管理功能。l l 与与C+C+相比,相比,SchemeSch
3、eme是一种快速程序设计语言,而且是一种快速程序设计语言,而且简洁易学。简洁易学。SchemeScheme语言的语法规则很少,总结如下:语言的语法规则很少,总结如下:l l通过交互地调用通过交互地调用SchemeScheme过程来执行程序;过程来执行程序;l lSchemeScheme过程及其参数都被包含在一对圆括号里;过程及其参数都被包含在一对圆括号里;l l圆括号里的部分被称为圆括号里的部分被称为SchemeScheme表达式;表达式;l l表达式中包含过程名称和过程参数,具体格式如下:表达式中包含过程名称和过程参数,具体格式如下:l l(过程名称(过程名称参数参数1 1,参数,参数2 2
4、,)l l分号分号“ “;” ”引导的部分为程序注释。引导的部分为程序注释。l l(如何运行(如何运行ACIS SchemeACIS Scheme解释器,请参看解释器,请参看17.3.117.3.1节)节)表达式表达式l l由于由于SchemeScheme是一种解释型的程序开发语言,其表达式只能在解释器是一种解释型的程序开发语言,其表达式只能在解释器中执行。运行中执行。运行ACISACIS的的Scheme AIDEScheme AIDE解释程序后,就可以在它的解释程序后,就可以在它的“ “acisacis” ”提示符下输入表达式,在表达式的结束处按回车就可以执提示符下输入表达式,在表达式的结束
5、处按回车就可以执行该表达式。以下是几个典型的算术表达式:行该表达式。以下是几个典型的算术表达式:l lacisacis输入:(输入:(* * 5 65 6)l l回车输出:回车输出:3030l lacisacis(* * 5 6 75 6 7)l l210210l l在在SchemeScheme的表达式中,操作符(如的表达式中,操作符(如* *)后面可以跟任意多个参数,但)后面可以跟任意多个参数,但是其间一定要用是其间一定要用 空格空格 隔开;并且一个表达式里可以包含一个或者隔开;并且一个表达式里可以包含一个或者多个表达式,如:多个表达式,如:l lacisacis(* *(+ 1 2+ 1
6、2)()(* * 5 65 6)l l9090l l理论上,表达式之间互相嵌套的层数是没有限制的,程序理论上,表达式之间互相嵌套的层数是没有限制的,程序员只要匹配好括号就行了。员只要匹配好括号就行了。l l上面表达式的例子中使用了两个标准的上面表达式的例子中使用了两个标准的SchemeScheme内部过程内部过程进行乘法和加法运算,而进行乘法和加法运算,而ACIS SchemeACIS Scheme还扩充了还扩充了ACISACIS造造型器专用的过程,用户可以按照上述标准型器专用的过程,用户可以按照上述标准SchemeScheme过程方过程方法调用这些造型过程,如下面命令可产生立方体:法调用这些
7、造型过程,如下面命令可产生立方体:l lacisacis输入:(输入:(solidsolid:blockblock(position 0 0 0position 0 0 0)()(position position 10 10 1010 1010)l l回车输出:回车输出:#entity 1 0#entity 1 0l l上述命令产生了一个正方体,如图上述命令产生了一个正方体,如图17.1.117.1.1,共调用了两个,共调用了两个ACIS SchemeACIS Scheme过程(过程(positionposition和和solidsolid:blockblock),),#entity #en
8、tity 1 01 0是该正方体的默认名称。是该正方体的默认名称。外部描述符外部描述符l lSchemeScheme表达式产生的每个对象都有一个外部表达式产生的每个对象都有一个外部描述符和一个内部描述符。虽然外部描述符描述符和一个内部描述符。虽然外部描述符看上去比较简单,它在与用户交互过程中有看上去比较简单,它在与用户交互过程中有重要作用。它会将一个过程的执行结果反馈重要作用。它会将一个过程的执行结果反馈给用户,例如我们前面举的一些例子中,如给用户,例如我们前面举的一些例子中,如果表达式的计算结果不被用作其他表达式的果表达式的计算结果不被用作其他表达式的参数,也就是说该表达式未被嵌套在其他表参
9、数,也就是说该表达式未被嵌套在其他表达式中,则达式中,则SchemeScheme解释器自动将表达式执行解释器自动将表达式执行结果的外部描述符输出,对于算术运算来说结果的外部描述符输出,对于算术运算来说其外部描述符只是一些简单的数字,如其外部描述符只是一些简单的数字,如3030,210210,9090等。等。l lACISACIS的对象也具有外部描述符,当一个含有的对象也具有外部描述符,当一个含有ACISACIS造型功能的过程被调用后,它所产生的造型功能的过程被调用后,它所产生的ACISACIS对象的描述符就会被解释器输出,其一对象的描述符就会被解释器输出,其一般格式如下:般格式如下:l l#t
10、ype_of_objecttype_of_object l l下面,我们看一个关于下面,我们看一个关于ACISACIS对象的例子:对象的例子:l l;产生一个;产生一个positionposition对象对象l lacisacis(position 10position 10,2020,3030)l l#position 10,20,30#position 10,20,30l l这个这个positionposition对象的外部描述符表示了一个对象的外部描述符表示了一个x=10x=10,y=20y=20,z=30z=30的坐标点。的坐标点。l l从从ACISACIS的的ENTITYENTITY
11、类派生的对象的外部描述类派生的对象的外部描述符与符与positionposition对象的外部描述符类似,稍微复对象的外部描述符类似,稍微复杂之处就是,这些东西被组织到所谓的零件杂之处就是,这些东西被组织到所谓的零件(PARTPART)单元中。在)单元中。在ACIS SchemeACIS Scheme解释器解释器开始运行时,它会自动产生一个编号为开始运行时,它会自动产生一个编号为1 1的默的默认零件。下面就是关于认零件。下面就是关于ACISACIS的的ENTITYENTITY对象对象的的SchemeScheme例子:例子:l l;产生一个长方体;产生一个长方体l lacisacis(solid
12、solid:blockblock(position 0 0 position 0 0 0 0)()(position 10 position 10 1010 1010)l l#entity 1 0#entity 1 0l l过程过程solidsolid:blockblock产生了一个产生了一个ACISACIS实体对象,实体对象,#entity 1 0#entity 1 0是它的外部描述符,该描述符是它的外部描述符,该描述符由两部分组成,即实体号(由两部分组成,即实体号(1 1)和零件号)和零件号(0 0),实体号可以作为其他过程的参数。下),实体号可以作为其他过程的参数。下面就是一个使用实体号
13、的例子:面就是一个使用实体号的例子:l l;删除一个实体;删除一个实体l lacisacis(entityentity:deletedelete(entity 1entity 1)l l()()l l注意:注意:“ “()()” ”表示空元素,表示空元素,SchemeScheme语言的语言的列表结构中会自动地在列表末尾增加它。列表结构中会自动地在列表末尾增加它。 变量变量l l在在SchemeScheme语言中可以用变量名称记录变量的数值,如语言中可以用变量名称记录变量的数值,如17.1.117.1.1节中的例子所示,一个过节中的例子所示,一个过程的返回值,如果不保存在一个变量中,没有多大用途
14、。程的返回值,如果不保存在一个变量中,没有多大用途。SchemeScheme语言中的变量和过程语言中的变量和过程都可以用一个符号表示,定义变量和过程的操作符是都可以用一个符号表示,定义变量和过程的操作符是definedefine,它可以命名一个表达式,它可以命名一个表达式,语法如下:语法如下:l l(definedefine名称名称表达式表达式)l l下面是两个变量定义的例子:下面是两个变量定义的例子:l l;定义数值变量;定义数值变量p pl lacisacis(define pdefine p(* * 10 10 1010 1010)l lp pl lacisacisp p ;调用变量;调
15、用变量p pl l10001000l l;定义;定义ACISACIS变量变量p1p1l lacisacis(define p1define p1(position 10 position 10 1010 1010)l lp1p1l lacisacisp1 p1 ;调用变量;调用变量p1p1l l#position 10 #position 10 1010 1010 l l上述例子中上述例子中p p是一个数值变量,是一个数值变量,p1p1是一个是一个positionposition对象变量。对象变量。函数函数l lSchemeScheme语言中的函数定义也是通过语言中的函数定义也是通过defin
16、edefine命令实现的,命令实现的,语法如下所示。在这个例子中,函数参数语法如下所示。在这个例子中,函数参数x x是一个局部变是一个局部变量,即只有在定义它的函数中有意义。量,即只有在定义它的函数中有意义。l l;定义函数;定义函数“ “square”square”l lacisacis(defiinedefiine (square xsquare x)()(* * x xx x)l lsquaresquarel lacisacis(square 6square 6)l l3636l l用用definedefine命令产生的函数以及变量是全局性的,对于一些命令产生的函数以及变量是全局性的,对
17、于一些简单的任务(用简单的任务(用3030到到5050行程序即可以完成的任务),完全行程序即可以完成的任务),完全可以使用这个命令进行处理。而从程序的可读性和避免变可以使用这个命令进行处理。而从程序的可读性和避免变量名的冲突来说,还需要其他一些更复杂的处理。量名的冲突来说,还需要其他一些更复杂的处理。Scheme中的读写操作中的读写操作l l在在ACIS SchemeACIS Scheme解释器里进行解释器里进行SATSAT文件的读写操作要比文件的读写操作要比C+C+中的操作简单得多,下面就是一个完整的中的操作简单得多,下面就是一个完整的SATSAT文件的文件的读写过程:读写过程:l l;产生
18、一个;产生一个BODYBODY对象对象l l(solid: block (position 0 0 0)(position 10 (solid: block (position 0 0 0)(position 10 1010 1010) )l l;将它保存到;将它保存到save.satsave.sat文件中文件中l l(part: save “E:/(part: save “E:/save.satsave.sat”) ”)l l;将;将BODYBODY删除删除l l(part: clear)(part: clear)l l;从文件;从文件save.satsave.sat中读入刚保存的实体中读入
19、刚保存的实体l l(part: load “E:/(part: load “E:/save.satsave.sat”) ”)用用Scheme产生基本几何体产生基本几何体l l用用ACIS SchemeACIS Scheme可以很快捷地产生基本几何体,如,在可以很快捷地产生基本几何体,如,在ACIS ACIS SchemeScheme解释器里输入如下命令就可以产生一个球体:解释器里输入如下命令就可以产生一个球体:l lacisacis(view: (view: glgl) ) ;生成一个视图窗口;生成一个视图窗口l lacisacis(solid: sphere(position(0 0 0 )
20、 20)(solid: sphere(position(0 0 0 ) 20)l l#entity 1 1 #entity 1 1 ;零件;零件0 0中的第一个实体中的第一个实体l l下面是几个产生基本几何体的函数:下面是几个产生基本几何体的函数: l lsolid: block (position solid: block (position 左下角顶点坐标左下角顶点坐标) (position ) (position 右上角顶点坐标右上角顶点坐标) ) ;立方体;立方体l lsolid: sphere (position solid: sphere (position 圆心坐标圆心坐标) )
21、 半径半径 ;球体;球体l lsolid:cylindersolid:cylinder (position (position下圆心坐标下圆心坐标) (position) (position上圆心坐标上圆心坐标) 20 ) 20 ;圆柱体;圆柱体l lsolid: cone (position solid: cone (position 下圆心坐标下圆心坐标) (position ) (position 顶点坐标顶点坐标) 25 0 ) 25 0 ;圆锥体;圆锥体ACIS Scheme中的集合运算中的集合运算l lACIS SchemeACIS Scheme中的集合运算与中的集合运算与C+C+
22、中的集合运算基本一样,惟一不同中的集合运算基本一样,惟一不同的是它可以将多个实体一起进行运算,这要比的是它可以将多个实体一起进行运算,这要比C+C+中的一次只能计算中的一次只能计算两个实体方便。下面是一个例子,为了与两个实体方便。下面是一个例子,为了与C+C+进行比较,这里仍然对进行比较,这里仍然对两个圆柱进行求并运算。两个圆柱进行求并运算。l l;两个正交的圆柱;两个正交的圆柱l l(define c1 (define c1 (solid:cylindersolid:cylinder (position 0 0 -50) (position 0 0 50) 20) (position 0 0
23、 -50) (position 0 0 50) 20)l l(define c2 (define c2 (solid:cylindersolid:cylinder (position 0 0 -50) (position 0 0 50) 20) (position 0 0 -50) (position 0 0 50) 20)l l;t1t1是将实体沿与是将实体沿与x x轴垂直的方向旋转轴垂直的方向旋转9090度的函数度的函数l l(define t1 (transform: rotation (position 0 0 0) (define t1 (transform: rotation (p
24、osition 0 0 0) (gvectorgvector 1 0 0) 90) 1 0 0) 90) l l(entity: transform c1 t1) (entity: transform c1 t1) ;把;把c1c1旋转旋转9090度度l l(define cross (solid: unite c1 c2) (define cross (solid: unite c1 c2) ;c1c1和和c2c2两个圆柱将被删除两个圆柱将被删除ACIS Scheme中的布尔运算中的布尔运算l lACIS SchemeACIS Scheme中提供了强大的布尔运算功能,不仅有效实体之间可以进行
25、布中提供了强大的布尔运算功能,不仅有效实体之间可以进行布尔运算,其他的一些几何实体之间也可以进行布尔运算。下面是一个平面与尔运算,其他的一些几何实体之间也可以进行布尔运算。下面是一个平面与双圆锥体之间的布尔运算:双圆锥体之间的布尔运算: l l;生成两个顶点重合的圆锥,即顶对顶,并将它们进行求并运算,然后将其;生成两个顶点重合的圆锥,即顶对顶,并将它们进行求并运算,然后将其结果与一个平面进行差运算结果与一个平面进行差运算l l(define c1 (solid: cone (position 40 0 0) (position 0 0 0) 25 0) (define c1 (solid: c
26、one (position 40 0 0) (position 0 0 0) 25 0) ;产;产生圆锥生圆锥c1c1l l(define c2 (solid: cone (position -40 0 0) (position 0 0 0) 25 0) (define c2 (solid: cone (position -40 0 0) (position 0 0 0) 25 0) ;产;产生圆锥生圆锥c2c2l l(define c3 (solid: unite c1 c2) (define c3 (solid: unite c1 c2) ;求并;求并l l(define (define
27、plane(face:planeplane(face:plane (position -100 100 5) 200 (position -100 100 5) 200 200200 ( (gvectorgvector 0 0 -1) 0 0 -1) ;产生平面;产生平面planeplanel l(define (define cut(sheetcut(sheet: face plane) : face plane) ;生成平面片;生成平面片l l( (boolbool: subtract c3 cut) : subtract c3 cut) ;求差;求差l l在上述例子中为了在一个三维实体和
28、一个二维平面片之间进行布尔差运算,在上述例子中为了在一个三维实体和一个二维平面片之间进行布尔差运算,没有使用适用于三维实体的没有使用适用于三维实体的solidsolid:subtractsubtract函数,而是使用了更通用的函数,而是使用了更通用的boolbool:subtractsubtract函数。函数。Scheme语言总结语言总结l l一个完整的一个完整的SchemeScheme程序由表达式和定义组成。这里,我们总结一下程序由表达式和定义组成。这里,我们总结一下SchemeScheme语言中的定义格式。语言中的定义格式。l l定义可以出现在程序的顶部,这时的定义被称为声明。定义也可以作
29、为一个主程序的开始,如一个函数或者过程的定义可以出现在程序的顶部,这时的定义被称为声明。定义也可以作为一个主程序的开始,如一个函数或者过程的开始。定义的格式有如下开始。定义的格式有如下4 4种:种:l l(1 1)()(definedefine变量变量表达式表达式),这是一种基本定义格式,一般变量的定义就是这种格式;),这是一种基本定义格式,一般变量的定义就是这种格式;l l(2 2)()(definedefine(变量变量形式参数形式参数程序体程序体),如定义局部函数的),如定义局部函数的lambdalambda语句就是这种定义格式,下面计语句就是这种定义格式,下面计算阶乘的数值函数的定义就
30、采用了这种定义方式:算阶乘的数值函数的定义就采用了这种定义方式:l l(define factorialdefine factorial(lambdalambda(numnum)l l(if if(= num 0= num 0)1 1(* * numnum(factorialfactorial(- num 1- num 1)l l注意:(注意:(definedefine(变量变量形式参数形式参数)程序体程序体),这种格式也是一种常用的函数定义的格式方法。以这种),这种格式也是一种常用的函数定义的格式方法。以这种格式定义上面例子里的格式定义上面例子里的factorialfactorial函数,程
31、序如下:函数,程序如下:l l(define define (factorial numfactorial num)l l(if if(= num 0= num 0)1 1(* * numnum(factorialfactorial(- num 1- num 1)l l(3 3)()(beginbegin(定义定义1 1定义定义2 2),这也是一种基本的定义格式。它可以同时定义多个变量。),这也是一种基本的定义格式。它可以同时定义多个变量。l l本节主要介绍了本节主要介绍了SchemeScheme语言的一些基本编程常识和几个基本几何造型的生成,在利用该语言进行系统开发时需要语言的一些基本编程常
32、识和几个基本几何造型的生成,在利用该语言进行系统开发时需要注意如下几个注意如下几个SchemeScheme编程的特点:编程的特点:l l(1 1)变量与表达式的执行顺序,如果要让程序严格按照编写顺序执行,必须使用)变量与表达式的执行顺序,如果要让程序严格按照编写顺序执行,必须使用let*let*或者或者beginbegin函数;函数;l l(2 2)圆括号的数量既不能多也不能少。如()圆括号的数量既不能多也不能少。如(newlinenewline)是正确的,而()是正确的,而(newlinenewline)则是一个错误表达式;)则是一个错误表达式;l l(3 3)由于)由于SchemeSche
33、me解释器对程序语句进行的检查不能返回出错程序所在的行号,所以一个函数或者过程不能太长,解释器对程序语句进行的检查不能返回出错程序所在的行号,所以一个函数或者过程不能太长,否则就会给程序的调试带来麻烦;否则就会给程序的调试带来麻烦;l l(4 4)在)在letlet表达式中产生的表达式中产生的BODYBODY对象,在函数或者过程结束后不能被自动删除。对象,在函数或者过程结束后不能被自动删除。第十八章第十八章 ACIS的实例代码的实例代码 l l18.1 用Scheme语言生成ACIS程序l l18.2 用Windows控制台环境编译ACIS程序l l18.3 用ACIS AppWizard生成
34、应用程序框架18.2 用用Windows控制台环境编译控制台环境编译ACIS程序程序l l本节主要通过几个实例程序讲解在C+中如何用Windows控制台环境编译和运行ACIS程序,同时给出几个在此环境下的简单几何造型的例程。ACIS C+程序基本结构程序基本结构l l在上一节中介绍了在上一节中介绍了ACISACIS平台上用平台上用SchemeScheme语言进行系统开发的一些常识,而语言进行系统开发的一些常识,而利用利用C+C+在在ACISACIS平台上进行系统开发时,除了遵循平台上进行系统开发时,除了遵循C+C+语言的规定之外,还语言的规定之外,还要注意要注意ACISACIS的一些特点,下面
35、是一个典型的的一些特点,下面是一个典型的ACIS C+ACIS C+程序结构:程序结构:l l#include #include / /含有系统函数的声明含有系统函数的声明l l#include “ACIS#include “ACIS头文件头文件” ” / /含有含有ACIS APIACIS API函数和类的声明函数和类的声明l lvoid main()void main()l l l l api_start_modeller(0); / api_start_modeller(0); /生成内部数据结构生成内部数据结构l l api_initialiszeapi_initialisze_”_”
36、组件组件” ”; ;l l /API /API函数和直接函数调用函数和直接函数调用l l api_terminateapi_terminate_”_”组件组件” ”; ;l l api_stop_modellerapi_stop_modeller(); /(); /删除内部数据结构删除内部数据结构l l l l关于如何用关于如何用Visual C+Visual C+进行进行ACISACIS程序的编译和连接,在第十七章的第三节中程序的编译和连接,在第十七章的第三节中已有详细讲解,这里不再赘述。已有详细讲解,这里不再赘述。用用API函数生成基本几何体函数生成基本几何体l lACISACIS一共提供
37、了生成一共提供了生成7 7种基本形状的方法,种基本形状的方法,包括包括4 4种旋转曲面体(球体、圆锥体、圆环以种旋转曲面体(球体、圆锥体、圆环以及圆柱)和及圆柱)和3 3种多面体(立方体、棱柱以及棱种多面体(立方体、棱柱以及棱锥)。锥)。l l下面是用下面是用APIAPI函数生成一个立方体的函数生成一个立方体的C+C+程序,程序,该程序首先生成一个立方体,而后用该程序首先生成一个立方体,而后用ACISACIS中中的调试功能将这个立方体的数据写入磁盘文的调试功能将这个立方体的数据写入磁盘文件中。件中。l l#include #include l l#include #include “const
38、ruct/“construct/kernapi/api/cstrapi.hxxkernapi/api/cstrapi.hxx” ” / /声明了构造声明了构造APIAPI函数函数l l#include “kernel/#include “kernel/kernapi/api/api.hxxkernapi/api/api.hxx” ” / /声明了声明了startstart和和stopAPIstopAPI函数函数l l#include #include “kernel/“kernel/kerndata/top/body.hxxkerndata/top/body.hxx” ” / /声明了声明了B
39、ODYBODY类类l l#include #include “kernel/“kernel/kerndata/data/debug.hxxkerndata/data/debug.hxx” ” / /声明了一些调试函数声明了一些调试函数l lvoid main()void main()l l l l api_start_modeller(0); / api_start_modeller(0); /生成内生成内部数据结构部数据结构l l api_initialisze_constructorsapi_initialisze_constructors();();l l BODY *block; /
40、BODY *block; /定义一个定义一个BODYBODY实体实体l l api_make_cuboid(100,50,200,block); /api_make_cuboid(100,50,200,block); /造出一个立方体造出一个立方体l lFILE *output=FILE *output=fopen(“cube.dbg”,”wfopen(“cube.dbg”,”w”); /”); /生生成成cube.dbgcube.dbg同时打开一个文件同时打开一个文件l ldebug_size(block.outputdebug_size(block.output); /); /用用debu
41、g_sizedebug_size把把blockblock写入打开的文件写入打开的文件l lfclose(outputfclose(output); /); /关闭文件关闭文件l l /API/API函数和直接函数调用函数和直接函数调用l l api_terminate_constructorsapi_terminate_constructors();();l l api_stop_modellerapi_stop_modeller(); /(); /删除删除内部数据结构内部数据结构l l 程序的执行过程分析程序的执行过程分析 l l启动造型器,它将产生一些基本的启动造型器,它将产生一些基本的A
42、CISACIS数据结构,在调用其他任何数据结构,在调用其他任何ACISACIS功能之功能之前必须进行这个处理;前必须进行这个处理;l l初始化应用到的组件,由于初始化应用到的组件,由于ACISACIS组件之组件之间存在一定的依赖关系,如果程序中使用间存在一定的依赖关系,如果程序中使用两个组件,而其中一个组件是建立在另一两个组件,而其中一个组件是建立在另一个组件之上的,那么只需要初始化这个组个组件之上的,那么只需要初始化这个组件,件,ACISACIS会自动将另一个组件初始化;会自动将另一个组件初始化;l l声明一个指针,该指针被指向将生成的声明一个指针,该指针被指向将生成的BODYBODY对象;
43、对象;l l调用调用ACISACIS的的APIAPI函数构造几何体;函数构造几何体;l l打开一个文件;打开一个文件;l l调用调试功能中的函数调用调试功能中的函数debug_sizedebug_size将将blockblock的数据结构以及其中每一部分所占的数据结构以及其中每一部分所占的内存空间写入(的内存空间写入(5 5)中打开的文件中;)中打开的文件中;l l关闭文件;关闭文件;l l中断组件,释放组件所占用的资源;中断组件,释放组件所占用的资源;l l停止造型器。停止造型器。l l运行该程序后将生成运行该程序后将生成cube.dbgcube.dbg文件,用一个文件,用一个文本编辑器打开
44、此文件,其内容如下:文本编辑器打开此文件,其内容如下:l l1 body record, 32 bytes1 body record, 32 bytesl l1 lump record, 32 bytes1 lump record, 32 bytesl l1 shell record, 40 bytes1 shell record, 40 bytesl l6 face records, 264 bytes6 face records, 264 bytesl l6 loop records, 192 bytes6 loop records, 192 bytesl l24 24 coedgecoe
45、dge records, 1056 bytes records, 1056 bytesl l12 edge records, 864 bytes12 edge records, 864 bytesl l8 vertex records, 192 bytes8 vertex records, 192 bytesl l12 curve records, 1344 bytes12 curve records, 1344 bytesl l8 point records, 384 bytes8 point records, 384 bytesl lTotal storage 5360 bytesTota
46、l storage 5360 bytesl l可见函数可见函数api_make_cuboidapi_make_cuboid至少产生了至少产生了8585个个对象,每个对象都需要一定的内存和一个指对象,每个对象都需要一定的内存和一个指针来表示它们。针来表示它们。模型文件的读写模型文件的读写l l因为一个单一的几何造型系统不可能提供所有用因为一个单一的几何造型系统不可能提供所有用户需要的功能,这时会出现下述情况,用户在一户需要的功能,这时会出现下述情况,用户在一个造型系统中生成零件的模型,而在另一个系统个造型系统中生成零件的模型,而在另一个系统(如有限元分析系统)进行模型分析,当这两个(如有限元分析
47、系统)进行模型分析,当这两个系统之间交换模型数据时,就需要一个可以被两系统之间交换模型数据时,就需要一个可以被两个系统都接受的文件格式;而目前,一般以个系统都接受的文件格式;而目前,一般以ACISACIS文件格式为标准;文件格式为标准;ACISACIS的模型文件一般被称为的模型文件一般被称为SATSAT文件,它包括文本文件(文件,它包括文本文件(.sat.sat)和二进制文)和二进制文件(件(. .sabsab),),ACISACIS的的APIAPI函数函数api_save_entity_listapi_save_entity_list可以生成可以生成SATSAT文件。文件。写写SAT文件文件
48、l l/ /该程序生成一个棱柱并将其保存到一个文件里该程序生成一个棱柱并将其保存到一个文件里l l#include #include / /含有函数含有函数printfprintf的声明的声明l l#include “construct/#include “construct/kernapi/api/cstrapi.hxxkernapi/api/cstrapi.hxx” /” /声声明了构造明了构造APIAPI函数函数l l#include “kernel/#include “kernel/kernapi/api/api.hxxkernapi/api/api.hxx” /” /声明了声明了st
49、artstart和和stopAPIstopAPI函数函数l l#include “kernel/#include “kernel/kerndata/top/alltop.hxxkerndata/top/alltop.hxx” /” /声明声明了了BODYBODY类类l l#include “kernel/#include “kernel/kerndata/lists/lists.hxxkerndata/lists/lists.hxx” /” /声声明了一些调试函数明了一些调试函数l l#include “kernel/#include “kernel/kerndata/savres/filei
50、nfo.hxxkerndata/savres/fileinfo.hxx” ” / /声明了声明了fileinfofileinfo类类l lvoid void save_ent(charsave_ent(char*,ENTITY*); /*,ENTITY*); /声明子函数声明子函数l lvoid main()void main()l l l l api_start_modeller(0); / api_start_modeller(0); /生成内部数据结构生成内部数据结构l l api_initialisze_constructorsapi_initialisze_constructors(
51、);();l l l lBODY *BODY *prispris; /; /定义一个定义一个BODYBODY实体实体l l api_make_prism(100,150,200,7,pris); /api_make_prism(100,150,200,7,pris); /造出一个造出一个7 7棱柱棱柱l lsave_ent(“E:/save.sat”,prissave_ent(“E:/save.sat”,pris); /); /调用调用save_entsave_ent函数把函数把prispris写入磁盘文件写入磁盘文件l l l lapi_terminate_constructorsapi_t
52、erminate_constructors();();l l api_stop_modellerapi_stop_modeller(); /(); /删除内部数据结构删除内部数据结构l l l lvoid void save_ent(charsave_ent(char* * filename,ENTITYfilename,ENTITY* * entent) )l l l l FileInfoFileInfo info; info;l l Info.set_product_id(“shanshi-sdnuInfo.set_product_id(“shanshi-sdnu”);”);l l Inf
53、o.set_unite(1.0); / Info.set_unite(1.0); /设置尺寸单位为毫米设置尺寸单位为毫米l l api_set_file_info(File|FileUnits,infoapi_set_file_info(File|FileUnits,info); );l l FILE * FILE *fpfp= =fopen(filename,”wfopen(filename,”w”);”);l lif(fpif(fp!=NULL)!=NULL)l l l l ENTITY_LIST* ENTITY_LIST* savelistsavelist=new ENTITY_LIST
54、;=new ENTITY_LIST;l l savelistsavelist-add(entadd(ent); );l l api_save_entity_list(fp,TRUEapi_save_entity_list(fp,TRUE,* ,*savelistsavelist); /); /TRUE:satTRUE:sat, , FALSE:sabFALSE:sabl l delete delete savelistsavelist; ;l l l lelse else printfprintf(“ (“不能打开文件不能打开文件n”);n”);l lfclose(fpfclose(fp);
55、);l l 上述程序中有上述程序中有5个关键步骤:个关键步骤:l l产生一个实体,此处为一个产生一个实体,此处为一个BODYBODY对象;对象;l l将实体加入实体列表将实体加入实体列表ENTITY_LISTENTITY_LIST中,可以加入多个实中,可以加入多个实体对象;体对象;l l产生产生FileInfoFileInfo对象,该对象定义了文件的头部信息;对象,该对象定义了文件的头部信息;l l调用调用api_set_file_infoapi_set_file_info设置文件头部信息,在生成模型文设置文件头部信息,在生成模型文件时这些信息会被自动加入到文件的头部;件时这些信息会被自动加入
56、到文件的头部;l l调用调用api_save_entity_listapi_save_entity_list将实体的将实体的ASCIIASCII信息写入文件。信息写入文件。l l注意:函数注意:函数set_unitsset_units是设置尺寸单位的函数,不同的参是设置尺寸单位的函数,不同的参数对应不同的单位,如下所示:数对应不同的单位,如下所示:l l-1.0=-1.0=未定义未定义 1.0=mm 10.0=cm 1000.0=m 1.0=mm 10.0=cm 1000.0=m 1000000.0=km 25.4=1000000.0=km 25.4=英尺英尺 304.8=304.8=英寸英寸
57、 914.4=914.4=码码 1609344.0=1609344.0=英里英里读读SAT文件文件l l将磁盘上的将磁盘上的SATSAT文件读入到内存中的操作是由文件读入到内存中的操作是由api_restore_entity_listapi_restore_entity_list函数完成的。该函数的使用与写函数完成的。该函数的使用与写SATSAT文件的文件的api_save_entity_listapi_save_entity_list函数函数完全一致:完全一致:l l/ /读读SATSAT文件文件l lENTITY_LIST ENTITY_LIST new_bitsnew_bits; ;l
58、lFILE *FILE *save_filesave_file= =fopen(“save_file”,”rfopen(“save_file”,”r”);”);l lapi_restore_entity_list(save_file,TRUE,new_bitsapi_restore_entity_list(save_file,TRUE,new_bits); );l lBODY BODY bodbod=(BODY*)new_bits0; /=(BODY*)new_bits0; /列表中的第一个实体列表中的第一个实体l l对于一个对于一个ACISACIS开发的入门者来说,经常犯的错误是忽略从文件恢
59、复的开发的入门者来说,经常犯的错误是忽略从文件恢复的模型中通常会含有变换矩阵这一模型中通常会含有变换矩阵这一ACISACIS常识。为了避免对常识。为了避免对BODYBODY对象进对象进行复杂的矩阵变换,可以使用行复杂的矩阵变换,可以使用api_change_body_trans(BODYapi_change_body_trans(BODY*,NULL)*,NULL)函数根据函数根据BODYBODY对象的变换矩对象的变换矩阵来更新对象中的几何体同时将阵来更新对象中的几何体同时将BODYBODY对象所包含的对象所包含的TRANSFORMTRANSFORM对对象设置为象设置为0 0矩阵。矩阵。ACI
60、S C+程序小结程序小结l lC+环境是ACIS程序的主要编译和运行的平台,而ACIS的AMFC类库提供了丰富的几何造型函数库,同时ACIS自身具有蒙面、富贵、网格面、扫掠一句昏话等多种实体造型和变形造型技术,由于本书的目的只是为广大C+爱好者指出一条通向ACIS殿堂之门的大路,就不再介绍这些技术,有兴趣的读者,可以仔细查阅ACIS HELP帮助文件,相信会受益匪浅的。下面给出ACIS的7种基本几何体的函数。基本几何造型函数:基本几何造型函数:l l;立方体;立方体l lapi_make_cuboid(length(x),width(y),height(zapi_make_cuboid(len
61、gth(x),width(y),height(z),BODY),BODY) ) l lapi_solid_block(positionapi_solid_block(position( (左上角顶点坐标左上角顶点坐标), ), position(position(右下角顶点坐标右下角顶点坐标),BODY),BODY)l l;球体;球体l lapi_make_sphereapi_make_sphere( (半径,半径,BODY)BODY)l lapi_solid_sphere(positionapi_solid_sphere(position( (圆心坐标圆心坐标), ),半径半径,) ,)l
62、l;圆环体;圆环体l lapi_make_torusapi_make_torus( (外环半径外环半径, ,环宽环宽,BODY),BODY)l lapi_solid_torus(positionapi_solid_torus(position( (环心坐标环心坐标), ), 外环半外环半径径, ,环宽环宽,BODY),BODY)l l;圆锥体;圆锥体l lapi_make_frustum(height(zapi_make_frustum(height(z), ), length(x),width(ylength(x),width(y), ),顶部半径顶部半径,BODY),BODY)l lapi
63、_solid_cylinder_cone(positionapi_solid_cylinder_cone(position( (顶部圆心坐顶部圆心坐标标), position(), position(底部圆心坐标底部圆心坐标), ),l lm*M_PI(m*M_PI(底部长轴底部长轴),n*M_PI(),n*M_PI(底部短轴底部短轴), ),l l0(0(顶部半径顶部半径), ),l lNULL,BODY)NULL,BODY)l l;圆柱体;圆柱体l lapi_make_frustum(height(zapi_make_frustum(height(z), ), length(x),widt
64、h(ylength(x),width(y), ),顶部半径顶部半径,BODY),BODY)l lapi_solid_cylinder_cone(positionapi_solid_cylinder_cone(position( (顶部圆心坐顶部圆心坐标标), position(), position(底部圆心坐标底部圆心坐标), ),l lm*M_PI(m*M_PI(底部长轴底部长轴),n*M_PI(),n*M_PI(底部短轴底部短轴), ),l l0(0(顶部半径顶部半径), ),l lNULL,BODY)NULL,BODY)l l;棱柱;棱柱l lapi_make_prism(height
65、(zapi_make_prism(height(z), ), length(x),width(ylength(x),width(y), ),棱数棱数,BODY),BODY)l l;棱锥;棱锥l lapi_make_pyramid(height(z),length(x),width(api_make_pyramid(height(z),length(x),width(y y), ),顶部半径顶部半径, ,棱数棱数,BODY),BODY)l l从上述函数形式可以看到,从上述函数形式可以看到,ACISACIS中产生基本几何体的中产生基本几何体的APIAPI函数有两种,它们的前缀分别是函数有两种,它们
66、的前缀分别是“ “make”make”(如(如api_make_cuboidapi_make_cuboid)和)和“ “solid”solid”(如(如api_solid_blockapi_solid_block),),这两种函数的不同点在于前者产生的几何体位于原点,而这两种函数的不同点在于前者产生的几何体位于原点,而后者产生的几何体可以在任何位置。函数后者产生的几何体可以在任何位置。函数api_solid_cylinder_coneapi_solid_cylinder_cone是一个典型的是一个典型的“ “solid”solid”型函数,型函数,它将两个位置点(它将两个位置点(positio
67、nposition对象)作为输入参数,几何体对象)作为输入参数,几何体的具体尺寸由这两个参数得出,而的具体尺寸由这两个参数得出,而“ “make”make”型函数型函数api_make_frustumapi_make_frustum需要一个明确的尺寸数值作为输入参数。需要一个明确的尺寸数值作为输入参数。ACISACIS之所以设计这两种函数,主要是为了将有数不胜任之所以设计这两种函数,主要是为了将有数不胜任的位置作为几何造型函数的参数而直接产生几何体。这种的位置作为几何造型函数的参数而直接产生几何体。这种功能可以提高几何造型系统的交互性能,这一点在进行系功能可以提高几何造型系统的交互性能,这一点
68、在进行系统开发时会体会到的。统开发时会体会到的。第十八章第十八章 ACIS的实例代码的实例代码 l l18.1 用Scheme语言生成ACIS程序l l18.2 用Windows控制台环境编译ACIS程序l l18.3 用ACIS AppWizard生成应用程序框架18.3 用用ACIS AppWizard生成应用程序框架生成应用程序框架l lACIS AppWizard可以产生一个应用程序框架,这在上一章第三节有详细的讲解,本节主要是通过几个简单的实例程序,引领读者迅速掌握用ACIS AppWizard编写简单应用程序的方法。用用ACIS AppWizard生成第一个可视化几何造型生成第一个
69、可视化几何造型l l按照第17.3.3节的讲解,一步一步地操作,就可以得到一个可执行文件my.exe,用这个文件我们就可以打开任何SAT文件,而本节的内容是在这个文件中添加一些函数,从而构造出一些简单的可视化的几何体。l l首先,在myView.h文件顶部添加如下头文件:l l#include #include acismfc/acisview.hxxacismfc/acisview.hxx l l#include #include baseutil/vector/acistol.hxxbaseutil/vector/acistol.hxx l l#include #include baseu
70、til/option/option.hxxbaseutil/option/option.hxx l l#include #include baseutil/vector/vector.hxxbaseutil/vector/vector.hxx l l#include #include baseutil/vector/unitvec.hxxbaseutil/vector/unitvec.hxx l l#include #include baseutil/vector/transf.hxxbaseutil/vector/transf.hxx l l#include blend/#include b
71、lend/kernapi/api/blendapi.hxxkernapi/api/blendapi.hxx l l#include #include boolean/kernapi/api/boolapi.hxxboolean/kernapi/api/boolapi.hxx l l#include #include constrct/kernapi/api/cstrapi.hxxconstrct/kernapi/api/cstrapi.hxx l l#include #include gihusk/api/gi_api.hxxgihusk/api/gi_api.hxx l l#include
72、#include gihusk/cam_ent.hxxgihusk/cam_ent.hxx l l#include #include gihusk/dl_ctx.hxxgihusk/dl_ctx.hxx l l#include #include gihusk/dsp_utl.hxxgihusk/dsp_utl.hxx l l#include #include gihusk/view_mgr.hxxgihusk/view_mgr.hxx l l#include part/#include part/pmhusk/api/part_api.hxxpmhusk/api/part_api.hxx l
73、l#include part/#include part/pmhusk/actpart.hxxpmhusk/actpart.hxx l l#include part/#include part/pmhusk/hashpart.hxxpmhusk/hashpart.hxx l l#include part/#include part/pmhusk/part.hxxpmhusk/part.hxx l l#include part/#include part/pmhusk/roll_utl.hxxpmhusk/roll_utl.hxx l l#include kernel/#include kern
74、el/acis.hxxacis.hxx l l#include kernel/#include kernel/geomhusk/acistype.hxxgeomhusk/acistype.hxx l l#include kernel/#include kernel/geomhusk/entwray.hxxgeomhusk/entwray.hxx l l#include kernel/#include kernel/geomhusk/getowner.hxxgeomhusk/getowner.hxx l l#include kernel/#include kernel/geomhusk/efil
75、ter.hxxgeomhusk/efilter.hxx l l#include kernel/#include kernel/geomhusk/wcs_utl.hxxgeomhusk/wcs_utl.hxx l l#include kernel/#include kernel/kernapi/api/api.hxxkernapi/api/api.hxx l l#include kernel/#include kernel/kernapi/api/api.errkernapi/api/api.err l l#include #include intersct/kernapi/api/intrap
76、i.hxxintersct/kernapi/api/intrapi.hxx l l#include #include constrct/kernapi/api/cstrapi.hxxconstrct/kernapi/api/cstrapi.hxx l l#include cover/#include cover/kernapi/api/coverapi.hxxkernapi/api/coverapi.hxx l l#include skin/#include skin/kernapi/api/skinapi.hxxkernapi/api/skinapi.hxx l l#include oper
77、ator/#include operator/kernapi/api/operapi.hxxkernapi/api/operapi.hxx l l#include offset/#include offset/kernapi/api/ofstapi.hxxkernapi/api/ofstapi.hxx l l#include kernel/#include kernel/kernapi/api/kernapi.hxxkernapi/api/kernapi.hxx l l#include kernel/#include kernel/kerndata/data/entity.hxxkerndat
78、a/data/entity.hxx l l#include kernel/#include kernel/kerndata/lists/lists.hxxkerndata/lists/lists.hxx l l#include kernel/#include kernel/kernutil/law/law.hxxkernutil/law/law.hxx l l#include kernel/#include kernel/kernapi/api/api.errkernapi/api/api.err l l#include kernel/#include kernel/kerndata/top/
79、face.hxxkerndata/top/face.hxx l l#include kernel/#include kernel/kerndata/geom/transfrm.hxxkerndata/geom/transfrm.hxx l l#include kernel/#include kernel/kerndata/top/alltop.hxxkerndata/top/alltop.hxx l l#include kernel/#include kernel/kerndata/top/edge.hxxkerndata/top/edge.hxx l l#include kernel/#in
80、clude kernel/kerndata/top/body.hxxkerndata/top/body.hxx l l#include kernel/#include kernel/kerndata/top/wire.hxxkerndata/top/wire.hxx l l#include kernel/#include kernel/spline/api/spl_api.hxxspline/api/spl_api.hxx l l#include kernel/#include kernel/kerndata/geometry/getbox.hxxkerndata/geometry/getbo
81、x.hxx l l#include kernel/#include kernel/kerndata/geom/curve.hxxkerndata/geom/curve.hxx l l#include kernel/#include kernel/kerngeom/curve/curdef.hxxkerngeom/curve/curdef.hxx l l#include kernel/#include kernel/kerndata/geom/plane.hxxkerndata/geom/plane.hxx l l#include kernel/#include kernel/kerndata/
82、geom/point.hxxkerndata/geom/point.hxx l l#include kernel/#include kernel/kerndata/geom/straight.hxxkerndata/geom/straight.hxx l l#include #include faceter/api/af_api.hxxfaceter/api/af_api.hxx l l#include #include faceter/meshmgr/ppmeshmg.hxxfaceter/meshmgr/ppmeshmg.hxx l l#include #include faceter/a
83、ttribs/refine.hxxfaceter/attribs/refine.hxx l l#include #include faceter/attribs/af_enum.hxxfaceter/attribs/af_enum.hxx l l #include sweep/ #include sweep/sg_husk/sweep/swp_opts.hxxsg_husk/sweep/swp_opts.hxx l l#include sweep/#include sweep/kernapi/api/sweepapi.hxxkernapi/api/sweepapi.hxx l l#includ
84、e #include acismfc/tools/sldtools.hxxacismfc/tools/sldtools.hxx l l#include #include acismfc/tools/crvtools.hxxacismfc/tools/crvtools.hxx l l#include #include euler/kernapi/api/eulerapi.hxxeuler/kernapi/api/eulerapi.hxx l l#include #include rnd_husk/api/rnd_api.hxxrnd_husk/api/rnd_api.hxx l l#includ
85、e #include acismfc/tools/geom_if.hxxacismfc/tools/geom_if.hxx 编程详细步骤编程详细步骤 l l1 1启动启动Visual C+ 6.0Visual C+ 6.0。l l2 2打开打开FileFile菜单,选择菜单,选择打开工作区间打开工作区间打开工作区间打开工作区间菜单项,出现菜单项,出现打开工作区打开工作区打开工作区打开工作区间间间间对话框。对话框。l l3 3在该对话框中选择在该对话框中选择MyMy文件夹下的文件夹下的my.dswmy.dsw,打开它。,打开它。l l4 4在在my Microsoft Visual C+my M
86、icrosoft Visual C+中,选择左下方的第二项中,选择左下方的第二项ResourceViewResourceView选项卡,双击选项卡,双击my resourcemy resourceMenuMenu下的下的IDR_MAINFRAMEIDR_MAINFRAME。,。,l l5 5在右边编辑框的菜单栏中添加在右边编辑框的菜单栏中添加TestTest菜单项,并创建其下拉子菜单项,并创建其下拉子菜单项菜单项cylindercylinder,将它的标识符(,将它的标识符(IDID)设置为)设置为ID_TEST_CYLINDERID_TEST_CYLINDER。l l6 6保存并关闭所有窗口
87、。保存并关闭所有窗口。l l7 7打开打开VC+VC+主菜单中的主菜单中的ViewView菜单,选择菜单,选择ClassWizardClassWizard命令,命令,出现出现MFC MFC ClassWizardClassWizard对话框。对话框。l l8 8选择选择Message MapsMessage Maps选项卡。选项卡。l l9 9从从Class NameClass Name下拉列表框中选择下拉列表框中选择CmyViewCmyView(因为工程名称(因为工程名称为为“ “MyMy” ”)。)。l l1010在在Object IdsObject Ids列表框中选择列表框中选择ID_T
88、EST_CYLINDERID_TEST_CYLINDER。l l1111单击单击COMMANDCOMMAND,再单击,再单击Add Add FounctionFounction按钮,然后点击按钮,然后点击弹出对话框的弹出对话框的OKOK按钮,最后点击按钮,最后点击Edit CodeEdit Code按钮,系统就自动按钮,系统就自动转到转到Void Void CmyCmy:OnTestCylinderOnTestCylinder函数的编辑界面。函数的编辑界面。l l1212加入如下代码:加入如下代码:l l/ TODO: Add your command handler code here/ T
89、ODO: Add your command handler code herel lBODY *BODY *cylicyli; /; /圆柱体的圆柱体的圆柱体的圆柱体的BODYBODY对象对象对象对象l lapi_make_frustum(20,5,5,5,cyli);/height,x,y,api_make_frustum(20,5,5,5,cyli);/height,x,y,顶部顶部顶部顶部半径半径半径半径,BODY,BODYl lSave(cyliSave(cyli); /); /调用保存子函数调用保存子函数调用保存子函数调用保存子函数l lInvalidate();Invalidate
90、(); / /显示新画的显示新画的显示新画的显示新画的图形图形图形图形l l此时如果按此时如果按Ctrl+F5Ctrl+F5,程序会显示,程序会显示SaveSave()函数未曾定义的错()函数未曾定义的错误,下面我们就添加该保存子函数:误,下面我们就添加该保存子函数:l l选择选择ClassViewClassView选项,打开选项,打开my classesmy classesCMyViewCMyView文件夹,右文件夹,右键单击键单击CMyViewCMyView,选择,选择Add member Add member FounctionFounction,函数类型为,函数类型为voidvoid,
91、函数描述是,函数描述是Save(voidSave(void *item) *item)。l l系统自动转入此函数编辑界面,加入如下代码:系统自动转入此函数编辑界面,加入如下代码:l l if(itemif(item=NULL) return;=NULL) return;l l PART* PART* pPartpPart = = GetDocumentGetDocument()-()-GetAcisDocumentGetAcisDocument()-()-Part();Part();l l pPartpPart-add(ENTITYadd(ENTITY*)item);*)item);l l 1
92、3 13这样最终完成了该程序的全部编写,可以点击这样最终完成了该程序的全部编写,可以点击“ “!” ”号,号,执行了,其结果是一个长执行了,其结果是一个长20mm20mm(默认单位),半径为(默认单位),半径为5mm5mm,以坐标原点为圆心的绿色(默认色)圆柱体。以坐标原点为圆心的绿色(默认色)圆柱体。l l注意:运行后出现文档界面,点击注意:运行后出现文档界面,点击TestTest下拉菜单的下拉菜单的CylinderCylinder,开始出现的图形只是一个绿色的圆面,这是因为程序默认的是开始出现的图形只是一个绿色的圆面,这是因为程序默认的是实体的俯视图(实体的俯视图(TopTop);只要点击
93、);只要点击ViewView下拉菜单的下拉菜单的OrbitOrbit就可以就可以旋转实体,点击旋转实体,点击PanPan就可以拖拉等等(读者可以试用其他的菜就可以拖拉等等(读者可以试用其他的菜单选项,看有什么功能)。单选项,看有什么功能)。对可视化几何造型进行简单操作对可视化几何造型进行简单操作l l上一节我们造出了一个简单的几何造型,但是它的颜色和位置都是默认或固上一节我们造出了一个简单的几何造型,但是它的颜色和位置都是默认或固定的,那么我们如何根据自己的意愿来操作它呢;这一节我们就学习,怎样定的,那么我们如何根据自己的意愿来操作它呢;这一节我们就学习,怎样给几何体着色,移位和旋转。给几何体
94、着色,移位和旋转。l l着色着色着色着色l l选择选择ClassViewClassView选项,打开选项,打开my classesmy classesCMyViewCMyView文件夹,右键单击文件夹,右键单击CMyViewCMyView,选择,选择Add member Add member FounctionFounction,函数类型为,函数类型为voidvoid,函数描述是,函数描述是SetColor(voidSetColor(void *body, double r, double g, double b) *body, double r, double g, double b)。l
95、l系统自动转入此函数编辑界面,加入如下代码:系统自动转入此函数编辑界面,加入如下代码:l l if(bodyif(body=NULL)returnNULL)return; ;l lapi_gi_set_entity_rgb(ENTITYapi_gi_set_entity_rgb(ENTITY*&)*&)body,rgb_color(r,g,bbody,rgb_color(r,g,b););l l其中,其中,api_gi_set_entity_rgbapi_gi_set_entity_rgb是着色函数,是着色函数,(ENTITY*&)body(ENTITY*&)body指定实体,指定实体, bo
96、dy,rgb_color(r,g,bbody,rgb_color(r,g,b) )进行着色。进行着色。l l在在Void Void CmyCmy:OnTestCylinderOnTestCylinder函数中函数中SaveSave()()()()调用上面,添加如下:调用上面,添加如下:l lSetColorSetColor(cylindercylinder,0 0,0 0,0 0););););l l运行后,圆柱体将变黑色;如果用(运行后,圆柱体将变黑色;如果用(1 1,1 1,1 1),则会成为与背景色相同的白),则会成为与背景色相同的白色;用(色;用(0.90.9,0.90.9,0.90.
97、9)就是银灰色等等,读者不妨自行调试,这里不再赘)就是银灰色等等,读者不妨自行调试,这里不再赘述。述。移位移位l l选择选择ClassViewClassView选项,打开选项,打开my classesmy classesCMyViewCMyView文件夹,右键单击文件夹,右键单击CMyViewCMyView,选择,选择Add member Add member FounctionFounction,函数类型为,函数类型为ENTITY *ENTITY *,函数,函数描述是描述是MoveEntity(ENTITYMoveEntity(ENTITY *&pre, vector *&pre, vect
98、or trasstrass) )。l l系统自动转入此函数编辑界面,加入如下代码:系统自动转入此函数编辑界面,加入如下代码:l l ENTITY* ENTITY* new_bodynew_body=NULL;=NULL;l lapi_copy_entity(ENTITYapi_copy_entity(ENTITY *&) *&)pre,(ENTITYpre,(ENTITY *&) *&)new_bodynew_body); );l ltransftransf moveemovee= =translate_transf(trasstranslate_transf(trass); );l lapi
99、_transform_entity(ENTITYapi_transform_entity(ENTITY *&) *&)new_body,moveenew_body,movee); );l lreturn return new_bodynew_body; ;l l其中,其中,api_copy_entityapi_copy_entity是复制函数,是复制函数,(ENTITY*&)pre(ENTITY*&)pre原实体,原实体,(ENTITY (ENTITY *&)*&)new_bodynew_body新实体;新实体;transftransf moveemovee= =translate_trans
100、f(trasstranslate_transf(trass) )是定义移方是定义移方向和大小的函数;向和大小的函数;apiapi_ transform _entity_ transform _entity是移位函数,把是移位函数,把(ENTITY (ENTITY *&)*&)new_bodynew_body按按moveemovee规则平移。规则平移。l l在在Void Void CmyCmy:OnTestCylinderOnTestCylinder函数中函数中SaveSave()()()()调用上面,添加如下:调用上面,添加如下:l lcylicyli =(BODY *) =(BODY *)M
101、oveEntity(ENTITYMoveEntity(ENTITY *&) *&) cylicyli, vector(-26,0,0);, vector(-26,0,0);l l/vector/vector(-26-26,0 0,0 0)表示沿表示沿x x轴轴轴轴向向负负负负方向平移方向平移2626个单位个单位l l运行后,原圆柱体就会被平移至底面圆心在(运行后,原圆柱体就会被平移至底面圆心在(-26-26,0 0,0 0)位置。)位置。旋转旋转l l选择选择ClassViewClassView选项,打开选项,打开my classesmy classesCMyViewCMyView文件夹,右键
102、单击文件夹,右键单击CMyViewCMyView,选择选择Add member Add member FounctionFounction,函数类型为,函数类型为ENTITY *ENTITY *,函数描述是,函数描述是RotateEntity(ENTITYRotateEntity(ENTITY *&pre, vector *&pre, vector acisacis, double arc), double arc)。l l系统自动转入此函数编辑界面,加入如下代码:系统自动转入此函数编辑界面,加入如下代码:l l ENTITY* ENTITY* new_bodynew_body=NULL;=N
103、ULL;l lapi_copy_entity(ENTITYapi_copy_entity(ENTITY *&) *&)pre,(ENTITYpre,(ENTITY *&) *&)new_bodynew_body); );l ltransftransf rotiroti= =rotate_transf(arc,acisrotate_transf(arc,acis); );l lapi_transform_entity(ENTITYapi_transform_entity(ENTITY *&) *&)new_body,rotinew_body,roti); );l lreturn return n
104、ew_bodynew_body; ;l l其中,其中,api_copy_entityapi_copy_entity是复制函数,是复制函数,(ENTITY*&)pre(ENTITY*&)pre原实体,原实体,(ENTITY *&)(ENTITY *&)new_bodynew_body新实体;新实体;transftransf rotiroti= =rotate_transf(arc,acisrotate_transf(arc,acis) )是定义旋转方向和度数的函数;是定义旋转方向和度数的函数;apiapi_ _ transform _entitytransform _entity是旋转函数,把是
105、旋转函数,把(ENTITY *&)(ENTITY *&)new_bodynew_body按按rotiroti规则旋转。规则旋转。l l在在Void Void CmyCmy:OnTestCylinderOnTestCylinder函数中函数中SaveSave()()()()调用上面,添加如下:调用上面,添加如下:l lcylicyli =(BODY *) =(BODY *)RotateEntity(ENTITYRotateEntity(ENTITY *&) cyli,vector(0,1,0),M_PI/2); *&) cyli,vector(0,1,0),M_PI/2); l l/vector
106、/vector(0,1,00,1,0)表示沿与表示沿与y y轴轴轴轴垂直的平面,垂直的平面,1 1指按顺时针方向,指按顺时针方向,M_PI/2M_PI/2旋转旋转9090度度l l运行后,原圆柱体就会以原点为中心被顺时针旋转运行后,原圆柱体就会以原点为中心被顺时针旋转9090度。度。对可视化几何造型进行布尔运算操作对可视化几何造型进行布尔运算操作l l在这千奇百怪的大千世界里,充满了各式各样的几何体,单靠在这千奇百怪的大千世界里,充满了各式各样的几何体,单靠ACISACIS提供的这提供的这7 7种基本几何造型是远远不能满足需要的;于是,种基本几何造型是远远不能满足需要的;于是,ACISACIS
107、也提供了将简单实体也提供了将简单实体经过剪切和连接形成小实体的方法,这种方法用数学概念描述为集合运算,经过剪切和连接形成小实体的方法,这种方法用数学概念描述为集合运算,通常称为布尔运算。下面将简要介绍三种基本的布尔运算:求并、求交及求通常称为布尔运算。下面将简要介绍三种基本的布尔运算:求并、求交及求差。差。l l求并求并求并求并l l在在Void Void CmyCmy:OnTestCylinderOnTestCylinder函数的编辑界面中,再函数的编辑界面中,再SaveSave()()()()前加入如前加入如下代码:下代码:l l BODY *cyli1; /BODY *cyli1; /定
108、义另一个圆柱体的定义另一个圆柱体的定义另一个圆柱体的定义另一个圆柱体的BODYBODY对象对象对象对象l lapi_make_frustum(100,5,5,5,cyli1); /api_make_frustum(100,5,5,5,cyli1); /height,x,yheight,x,y, ,顶部半径顶部半径顶部半径顶部半径,BODY,BODYl l api_unite(cyli,cyli1); / api_unite(cyli,cyli1); /求两圆柱的并集,结果保存在求两圆柱的并集,结果保存在求两圆柱的并集,结果保存在求两圆柱的并集,结果保存在cyli1cyli1中中中中l lSav
109、e(cyli1); /Save(cyli1); /调用保存子函数调用保存子函数调用保存子函数调用保存子函数l l求交求交求交求交l l将上述代码中的将上述代码中的api_unite(cyli,cyli1); api_unite(cyli,cyli1); 换成换成api_intersect(cyli,cyli1); api_intersect(cyli,cyli1); 即可。即可。l l求差求差求差求差l l将上述代码中的将上述代码中的api_unite(cyli,cyli1); api_unite(cyli,cyli1); 换成换成api_subtract(cyli,cyli1); api_s
110、ubtract(cyli,cyli1); 即可即可 总结总结l l通过本小节的学习,大家不难发现,其实通过本小节的学习,大家不难发现,其实C+C+控控制台程序和制台程序和AppWziardAppWziard应用程序是相通的,基本应用程序是相通的,基本几何造型函数、布尔运算函数以及其他的几何造型函数、布尔运算函数以及其他的APIAPI函数函数在这两种环境下是通用的(这也没什么奇怪的,在这两种环境下是通用的(这也没什么奇怪的,都是都是C+C+平台嘛),不过平台嘛),不过AppWziardAppWziard应用程序能应用程序能可视化,更友好些。可视化,更友好些。l lACISACIS的几何造型技术丰
111、富多样,提供的方法、函的几何造型技术丰富多样,提供的方法、函数也纷繁复杂,本书因为篇幅和笔者水平所限,数也纷繁复杂,本书因为篇幅和笔者水平所限,仅仅为读者指出其路,打开其门而已;有兴趣的仅仅为读者指出其路,打开其门而已;有兴趣的读者,可以沿着这条路继续深入其境,相信定能读者,可以沿着这条路继续深入其境,相信定能大开眼界,满载而归。大开眼界,满载而归。总结总结l l18.1 18.1 用用SchemeScheme语言生成语言生成ACISACIS程序程序l l18.2 18.2 用用WindowsWindows控制台环境编译控制台环境编译ACISACIS程序程序l l18.3 18.3 用用ACIS AppWizardACIS AppWizard生成应用程序框架生成应用程序框架本本 章章 结结 束束