api_start_modeler(0);//生成内部数据结构 api_initialize_\组件\
//api函数和直接函数调用 api_terminata_\组件\
api_stop_modeler();//删除内部数据结构
例子:
void main(){
api_start_modellor(0); //启动造型器 api_initialize_constructors(); //初始化应用程序组件 BODY *block; //声明一个指针 api_make_cuboid(100,50,200,block); //调用ACIS的API函数构造几何体 FILE *output = fopen(“cube.dbg”,”w”); //打开一个文件 debug.size(block,output); //调用调式功能的函数将数据结构存入文件 fclose(output); //关闭文件 api_terminate_constructors(); //中断组件,释放组件所占用的组件 api_stop_modeller(); //停止造型器 }
利用ACIS和HOOPS来开发三维图形软件,编程时的基本思路; 启动:
api_start_modeller(0); ……
造型:
HC_Open_Segment_By_Key(m_pHView->GetViewKey());
BODY* sphere_body;
api_make_sphere(radius, sphere_body); ……
转换:
HA_Set_Rendering_Option();
HA_Render_Entity((ENTITY*) sphere_body); HC_Close_Segment(); ……
终止:
HA_Close();
api_stop_modeller();
在工程中实现对四面体的“实时拖动变形”功能
1 建立ACIS/HOOPS造型平台acispartview。
2 在acispartview中构造ACIS数据结构的四面体模型。 参考教材14.5。
3 实现在Hoops中显示该四面体模型。
参考程序1。添加了两个成员变量: m_iIndexVertex、m_positon[4]。 4 响应顶点(Vertex)被选中的消息。 参考程序2。
5 实现“实时拖动变形”功能:将某一顶点拖动到屏幕任意位置后,重新构造新四面体。 参考程序3。 6 完善该程序。 6.1 将构件四面体的功能添加到菜单功能中; 6.2 拖拽鼠标,构造四面体动态线框,以表达拖拽的实时性。
参考程序1:
“CSolidHoopsView.h”下添加如下两个成员变量: public: int m_iIndexVertex; //标示当前被选中顶点的序号@zxc SPAposition* m_positon[4]; //四面体的四个顶点@zxc
void CSolidHoopsView::OnTetra() { HSolidModel* pSolidModel = (HSolidModel*)(m_pHView->GetModel()); if (!pSolidModel) return ; pSolidModel->m_bSolidData = true; // 将m_bSolidData设为TURE,则可以选中顶点 pSolidModel->m_bSolidModel = true; pSolidModel->SetBRepGeometry(true); pSolidModel->SetModelHandedness(HandednessSetLeft); //构造一个四面体 m_positon[0] = new SPAposition(0.0,0.0,0.0); m_positon[1] = new SPAposition(10.0,0.0,0.0); m_positon[2] = new SPAposition(0.0,10.0,0.0); m_positon[3] = new SPAposition(0.0,0.0,10.0); BODY *block; Tetrahedron(block); //四面体的构造函数,参考教材14.5 pSolidModel->AddAcisEntity(block); HC_Open_Segment_By_Key(m_pHView->GetModelKey()); }
HA_Render_Entity(block);// ha_bridge将ACIS几何体转换为Hoops几何体 HC_Close_Segment(); m_pHView->Update();
参考程序2:
void CSolidHoopsView::OnLButtonDown(UINT nFlags, CPoint point)
{
CHoopsView::OnLButtonDown(nFlags,point);
//判断顶点是否选中,如果选中,记录被选择点的序号 HSelectionSet* sel_set = m_pHView->GetSelection();
const HSelectionItem *selItem=sel_set->GetSelectionItemAt(0);//@zxc if (selItem != NULL)
{ HC_KEY hKey=selItem->GetKey(); if (hKey!=NULL) { char type[MVO_BUFFER_SIZE]; HC_Show_Key_Type(hKey, type); char* pdest; pdest=strstr(type,\ if (pdest != NULL)
{//
AfxMessageBox(_T(\选中的对象是顶点!\ ENTITY*enty=HA_Compute_Entity_Pointer(hKey); VERTEX* vertex=(VERTEX*)enty;
SPAposition pos=vertex->geometry()->coords(); for (int i=0;i<=3;i++)
{if (*m_positon[i] == pos) {m_iIndexVertex=i+1; break;}}}}}}
参考程序3:
void CSolidHoopsView::OnLButtonUp(UINT nFlags, CPoint point)
{ HSolidModel* pSolidModel = (HSolidModel*)(m_pHView->GetModel()); if (!pSolidModel) return ; if (m_iIndexVertex!=0) { pSolidModel->DeleteAllEntities();//删除原来的四面体,再重构一个新的四面体 HC_Open_Segment_By_Key(m_pHView->GetSceneKey()); HPoint localPixel,world; localPixel.Set(point.x,point.y,0.0); HC_Compute_Coordinates(\ m_positon[m_iIndexVertex-1]->set_x(world.x); m_positon[m_iIndexVertex-1]->set_y(world.y); m_positon[m_iIndexVertex-1]->set_z(world.z);
m_iIndexVertex=0;//标示符m_iIndexVertex清零,重新构造四面体后, HC_Close_Segment(); 可对四面体反复拖拽。 BODY *block;
Tetrahedron(block);
pSolidModel->AddAcisEntity(block); HC_Open_Segment_By_Key(m_pHView->GetModelKey()); HC_Insert_Line(0.0,0.0,0.0,20.0,20.0,20.0);
HA_Render_Entity(block); HC_Close_Segment(); m_pHView->Update(); }
CHoopsView::OnLButtonUp(nFlags,point);}
掌握acispartview工程功能实现机制
通过上面的例子,理解工程中部分功能模块的实现机制
例1:
点击菜单项View->Tetra,在窗口中显示了一个四面体
它的实现机制是:点击tetra后,产生了一个消息COMMAND消息,该消息ID是IDM_TETRA,根据消息ID,系统调用OnTetra()函数,OnTetra()函数里面封装了四面体的实现过程。
例2:
点击
按钮,窗口中四面体显示为实线
点击Wireframe
按钮后,产生了一个COMMAND消息,消息ID为
ID_TOOLS_RENDERMODE_WIREFRAME,系统根据消息ID调用函数,CSolidHoopsView::OnToolsRendermodeWireframe(),该函数封装了将实体用实线表示的方式,同时也产生了一个ON_UPDATE_COMMAND_UI消息,保证了活其中一个。
通过以上例子的学习,利用VC6.0,查看源代码,使我们对acispartview工程中的功能实现有了初步的了解,工具栏和菜单栏中功能的实现基本与上面的例子类似。我们在学习过程中,还应该不断的积累文档内容,了解相关API,这样保证我们在今后的工作中能更加得心应手。
三个toolbars只激
Acispartviewer的修改:实现三维立方体的功能
在acispartviewer窗口中构建一个立方体,首先在资源文件的菜单选项里添加菜单项(lifang),设置其消息ID(IDM_LIFANG)
在CSoildHoopsView类的头文件中添加消息处理函数OnLifang(),