- UID
- 1
- 积分
- 16111
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
发表于 2002-6-28 23:56:12
|
显示全部楼层
Re: [ARX函数]:[ARX函数]:求助!!! 各位大虾帮忙啦!
最初由 laoga 发布
[B]我做一个ObjectARX的程序,实体之间进行切割,
用了AcDb3dSolid的布尔运算,substract。
由于处理的dwg文件中,有较多的AcDb3dSolid,
发现在循环批处理切割的时候,内存消耗一直上涨,
接近系统极限,甚至瘫?.. [/B]
内存耗尽原因是ACIS和AUTOCAD交互过程中引起的。ACIS要创建一个“Bulletin Boards”在应用中,然而他们仅仅是在AUTOCAD命令开始和结束的时候蔡删除。
有两种方法能解决这个问题:
A- 使用 ads_command()
B- 利用 AcDbArc::getGeomExtents() 的副作用
2. 在你的循环处理里面调用下面的函数。
注意:方法1和2适合R13和R14
1.定义一个新的命令:
acedRegCmds->addCommand (
"TEST", "doNoting", "doNothing", ACRX_CMD_MODAL, doNothing
);
命令的原型可以是下面这样写:
void doNothing(){
}
2. 在你的循环处理里面调用上面的命令:
ads_command(RTSTR,"doNothing",RTNONE);
3. 定义一个新的函数:
AcDbArc *p =new AcDbArc (AcGePoint3d (), 2, 0.0, 1.0);
AcDbExtents extents;
p->getGeomExtents (extents);
delete p;
注意: 下面方法仅仅适合2000+
在dbacis.h 里面,定义了'void acdbAcisDeleteModelerBulletins(void);'可以释放ACIS的Bulletin Boards
下面是完整的代码:
- [FONT=courier new]
- void doNothing(){
- }
- void CleanUp(){
- AcDbArc *p =new AcDbArc (AcGePoint3d (), 2, 0.0, 1.0);
- AcDbExtents extents;
- p->getGeomExtents (extents);
- delete p;
- }
- void test(){
- AcDb3dSolid* pS;
- pS = new AcDb3dSolid;
- pS->createSphere(10);
- AcGeMatrix3d xform;
- AcGeVector3d vec(10.0,0.0,0.0);
- xform.setToIdentity();
- xform.setTranslation(vec);
- AcDbExtents ext;
- for (int i=0;i<5000;i++) // 5000 做测试用的一个大的数 {
- pS->transformBy(xform);
- // 当你需要释放内存的时候,调用
- // ads_command() 或者CleanUp()
- CleanUp();
- // 或者在R2000下,调用acdbAcisDeleteModelerBulletins();
- }
- delete pS;
- }
- extern "C" AcRx::AppRetCode
- acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
- {
- switch (msg) {
- case AcRx::kInitAppMsg:
- acrxDynamicLinker->unlockApplication(pkt);
- acedRegCmds->addCommand ("TEST", "test", "test", ACRX_CMD_MODAL,test);
- acedRegCmds->addCommand ("TEST", "doNoting", "doNothing",
- ACRX_CMD_MODAL, doNothing);
- break;
- case AcRx::kUnloadAppMsg:
- acedRegCmds->removeGroup ("TEST");
- }
- return AcRx::kRetOK;
- }
- [/FONT]
复制代码 |
|