用Windows控制台环境编译ACIS程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18.1用Windows控制台环境编译ACIS程序
本节主要通过几个实例程序讲解在C++中如何用Windows控制台环境编译和运行ACIS 程序,同时给出几个在此环境下的简单几何造型的例程。
18.1.1ACIS C++程序基本结构
在上一节中介绍了ACIS平台上用Scheme语言进行系统开发的一些常识,而利用C++在ACIS平台上进行系统开发时,除了遵循C++语言的规定之外,还要注意ACIS的一些特点,下面是一个典型的ACIS C++程序结构:
#include <系统头文件> //含有系统函数的声明
#include “ACIS头文件”//含有ACIS API函数和类的声明
void main()
{
api_start_modeller(0); //生成内部数据结构
api_initialisze_”组件”;
//API函数和直接函数调用
api_terminate_”组件”;
api_stop_modeller(); //删除内部数据结构
}
关于如何用Visual C++进行ACIS程序的编译和连接,在第十七章的第三节中已有详细讲解,这里不再赘述。
用API函数生成基本几何体
ACIS一共提供了生成7种基本形状的方法,包括4种旋转曲面体(球体、圆锥体、圆环以及圆柱)和3种多面体(立方体、棱柱以及棱锥)。
下面是用API函数生成一个立方体的C++程序,该程序首先生成一个立方体,而后用ACIS中的调试功能将这个立方体的数据写入磁盘文件中。
#include <stdio.h>
#include “construct/kernapi/api/cstrapi.hxx”//声明了构造API函数
#include “kernel/kernapi/api/api.hxx”//声明了start和stopAPI函数
#include “kernel/kerndata/top/body.hxx”//声明了BODY类
#include “kernel/kerndata/data/debug.hxx”//声明了一些调试函数
void main()
{
api_start_modeller(0); //生成内部数据结构
api_initialisze_constructors();
BODY *block; //定义一个BODY实体
api_make_cuboid(100,50,200,block); //造出一个立方体
FILE *output=fopen(“cube.dbg”,”w”); //生成cube.dbg同时打开一个文件
debug_size(block.output); //用debug_size把block写入打开的文件
fclose(output); //关闭文件
//API函数和直接函数调用
api_terminate_constructors();
api_stop_modeller(); //删除内部数据结构
}
上述程序经过编译和连接就生成了一个可执行程序,运行它就可以生成一个立方体(当然还看不到它,但是可以通过程序生成的文件cube.dbg的内容看到该立方体的数据结构)。
这就可以看到第一个用ACIS开发的图形程序,虽然它很简单,但是它确确实实是一个ACIS 应用程序。
下面是该程序的执行过程分析:
(1)启动造型器,它将产生一些基本的ACIS数据结构,在调用其他任何ACIS 功能之前必须进行这个处理;
(2)初始化应用到的组件,由于ACIS组件之间存在一定的依赖关系,如果程序中使用两个组件,而其中一个组件是建立在另一个组件之上的,那么只需要
初始化这个组件,ACIS会自动将另一个组件初始化;
(3)声明一个指针,该指针被指向将生成的BODY对象;
(4)调用ACIS的API函数构造几何体;
(5)打开一个文件;
(6)调用调试功能中的函数debug_size将block的数据结构以及其中每一部分所占的内存空间写入(5)中打开的文件中;
(7)关闭文件;
(8)中断组件,释放组件所占用的资源;
(9)停止造型器。
运行该程序后将生成cube.dbg文件,用一个文本编辑器打开此文件,其内容如下:
1 body record, 3
2 bytes
1 lump record, 3
2 bytes
1 shell record, 40 bytes
6 face records, 264 bytes
6 loop records, 192 bytes
24 coedge records, 1056 bytes
12 edge records, 864 bytes
8 vertex records, 192 bytes
12 curve records, 1344 bytes
8 point records, 384 bytes
Total storage 5360 bytes
可见函数api_make_cuboid至少产生了85个对象,每个对象都需要一定的内存和一个指针来表示它们。
18.1.2模型文件的读写
因为一个单一的几何造型系统不可能提供所有用户需要的功能,这时会出现下述情况,用户在一个造型系统中生成零件的模型,而在另一个系统(如有限元分析系统)进行模型分析,当这两个系统之间交换模型数据时,就需要一个可以被两个系统都接受的文件格式;而目前,一般以ACIS文件格式为标准;ACIS的模型文件一般被称为SA T文件,它包括文本文件(.sat)和二进制文件(.sab),ACIS的API函数api_save_entity_list可以生成SA T文件。
写SAT文件
//该程序生成一个棱柱并将其保存到一个文件里
#include <stdio.h> //含有函数printf的声明
#include “construct/kernapi/api/cstrapi.hxx”//声明了构造API函数
#include “kernel/kernapi/api/api.hxx”//声明了start和stopAPI函数#include “kernel/kerndata/top/alltop.hxx”//声明了BODY类
#include “kernel/kerndata/lists/lists.hxx”//声明了一些调试函数
#include “kernel/kerndata/savres/fileinfo.hxx”//声明了fileinfo类
void save_ent(char*,ENTITY*); //声明子函数
void main()
{
api_start_modeller(0); //生成内部数据结构
api_initialisze_constructors();
BODY *pris; //定义一个BODY实体
api_make_prism(100,150,200,7,pris); //造出一个7棱柱
save_ent(“E:/save.sat”,pris); //调用save_ent函数把pris写入磁盘文件
api_terminate_constructors();
api_stop_modeller(); //删除内部数据结构
}
void save_ent(char* filename,ENTITY* ent)
{
FileInfo info;
Info.set_product_id(“shanshi-sdnu”);
Info.set_unite(1.0); //设置尺寸单位为毫米
api_set_file_info(File|FileUnits,info);
FILE *fp=fopen(filename,”w”);
if(fp!=NULL)
{
ENTITY_LIST* savelist=new ENTITY_LIST;
savelist->add(ent);
api_save_entity_list(fp,TRUE,*savelist); //TRUE:sat, FALSE:sab
delete savelist;
}
else printf(“不能打开文件\n”);
fclose(fp);
}
上述程序中有5个关键步骤:
(1)产生一个实体,此处为一个BODY对象;
(2)将实体加入实体列表ENTITY_LIST中,可以加入多个实体对象;
(3)产生FileInfo对象,该对象定义了文件的头部信息;
(4)调用api_set_file_info设置文件头部信息,在生成模型文件时这些信息会被自动加入到文件的头部;
(5)调用api_save_entity_list将实体的ASCII信息写入文件。
注意:函数set_units是设置尺寸单位的函数,不同的参数对应不同的单位,如下所示:-1.0=未定义 1.0=mm 10.0=cm 1000.0=m 1000000.0=km 25.4=英尺304.8=英寸914.4=码1609344.0=英里
读SAT文件
将磁盘上的SA T文件读入到内存中的操作是由api_restore_entity_list函数完成的。
该函数的使用与写SA T文件的api_save_entity_list函数完全一致:
//读SA T文件
ENTITY_LIST new_bits;
FILE *save_file=fopen(“save_file”,”r”);
api_restore_entity_list(save_file,TRUE,new_bits);
BODY bod=(BODY*)new_bits[0]; //列表中的第一个实体
对于一个ACIS开发的入门者来说,经常犯的错误是忽略从文件恢复的模型中通常会含有变换矩阵这一ACIS常识。
为了避免对BODY对象进行复杂的矩阵变换,可以使用api_change_body_trans(BODY*,NULL)函数根据BODY对象的变换矩阵来更新对象中的几何体同时将BODY对象所包含的TRANSFORM对象设置为0矩阵。
18.1.3ACIS C++程序小结
C++环境是ACIS程序的主要编译和运行的平台,而ACIS的AMFC类库提供了丰富的几何造型函数库,同时ACIS自身具有蒙面、富贵、网格面、扫掠一句昏话等多种实体造型和变形造型技术,由于本书的目的只是为广大C++爱好者指出一条通向ACIS殿堂之门的大路,就不再介绍这些技术,有兴趣的读者,可以仔细查阅ACIS HELP帮助文件,相信会受益匪浅的。
下面给出ACIS的7种基本几何体的函数。
基本几何造型函数:
;立方体
api_make_cuboid(length(x),width(y),height(z),BODY)
api_solid_block(position(左上角顶点坐标), position(右下角顶点坐标),BODY)
;球体
api_make_sphere(半径,BODY)
api_solid_sphere(position(圆心坐标),半径,)
;圆环体
api_make_torus(外环半径,环宽,BODY)
api_solid_torus(position(环心坐标), 外环半径,环宽,BODY)
;圆锥体
api_make_frustum(height(z), length(x),width(y),顶部半径,BODY)
api_solid_cylinder_cone(position(顶部圆心坐标), position(底部圆心坐标),
m*M_PI(底部长轴),n*M_PI(底部短轴),
0(顶部半径),
NULL,BODY)
;圆柱体
api_make_frustum(height(z), length(x),width(y),顶部半径,BODY)
api_solid_cylinder_cone(position(顶部圆心坐标), position(底部圆心坐标),
m*M_PI(底部长轴),n*M_PI(底部短轴),
0(顶部半径),
NULL,BODY)
;棱柱
api_make_prism(height(z), length(x),width(y),棱数,BODY)
;棱锥
api_make_pyramid(height(z),length(x),width(y),顶部半径,棱数,BODY)
从上述函数形式可以看到,ACIS中产生基本几何体的API函数有两种,它们的前缀分别是“make”(如api_make_cuboid)和“solid”(如api_solid_block),这两种函数的不同点在于前者产生的几何体位于原点,而后者产生的几何体可以在任何位置。
函数api_solid_cylinder_cone是一个典型的“solid”型函数,它将两个位置点(position对象)作为输入参数,几何体的具体尺寸由这两个参数得出,而“make”型函数api_make_frustum 需要一个明确的尺寸数值作为输入参数。
ACIS之所以设计这两种函数,主要是为了将有数不胜任的位置作为几何造型函数的参数而直接产生几何体。
这种功能可以提高几何造型系统的交互性能,这一点在进行系统开发时会体会到的。