找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 523|回复: 3

[求助]:高效创建大量实体的问题

[复制链接]
发表于 2005-12-24 14:17:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
现在要向数据库中添加大量实体,如AcDbFace
// 打开数据库
AcDbFace *pFace;
for(循环很多次)
{
     pFace = new AcDbFace(p1, p2, p3);
     pBlockTableRecord->appendAcDbEntity(objId, pFace);
     pFace->close();
}
//关闭数据库
这样创建很多3dFace时要每次new一个AcDbFace又要析够一次很浪费.
能不能只new一个,后面每次改变它的几个顶点,再加入数据库?
AcDbFace *pFace = new AcDbFace();
for()
{//改变p1,p2,p3
     pFace->setVertexAt(0, p1);
     pFace->setVertexAt(1, p2);
     pFace->setVertexAt(2, p3);
     pFace->setVertexAt(3, p1);
     pBlockTableRecord->appendAcDbEntity(objId, pFace);
     pFace->close();
}
但是这样好像一直都只是改变这一个3dFace的顶点,不会把改变顶点后的3dFace当作一个新的添加进数据库
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-12-24 19:27:02 | 显示全部楼层
绝对不行!因为每new一次,才能创建一个对象,否则始终是一个对象.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-16 11:25:21 | 显示全部楼层
2楼:为什么每次只能new 一个?你的C++知识不过关吧!!!
AcDbFace *pFace = new AcDbFace[n];   //n为你要申请的个数
然后:
while(加限制条件)
{
   pFace->set..........
   pFace->append......
   pFace++;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-16 21:29:20 | 显示全部楼层
1、做人原则:与人为善
2、对待问题:不要急于下结论,仔细考察一下再发表意见(不信试试AcDbLine *pLine=new AcDbLine[100];能否编译通过)
3、new[]操作符在普通C++类中可用,但在ARX中,凡以AcDbObject为基类的所有子类中均不可用,原因在于new[]操作符在AcDbObject中被声明在private区中,明显是做了特殊限制
4、我来说说如何以较高效率创建大量实体(此情况下一般为同类实体):
   (1)、尽可能以预分配缓冲的方式存放构造实体所需的基本数据,从而降低数据的提取和传送时间。
   (2)、尽可能一次打开实体存放的目标容器(如块表记录),实体追加完成后再关闭,因为频繁打开/关闭容器很耗时(CAD好像在做大量的验证和状态设置)。
   (3)、尽可能将实体创建、追加等操作封装成一个事务(也就是采用事务管理器来管理大量新建实体),这样可以提高效率。因为事务中的对象是被成批处理的。
做到这三点,总体效率应该是很高的,而且也不难。

算了,写段代码说明一下吧,不当之处请指正:
[PHP]
void doit(AcGePoint3d *pPntBuffer,int nItem)
{
        AcDbBlockTable *pBT;
        AcDbBlockTableRecord *pBTR;
        AcDbFace *pFace;       

        acdbCurDwg()->getBlockTable(pBT,AcDb::kForRead);
        pBT->getAt(ACDB_MODEL_SPACE,pBTR,AcDb::kForWrite);
        pBT->close();
        acTransactionManagerPtr()->startTransaction();       
       
        for(int i=0;i<nItem;++i)
        {
                pFace=new AcDbFace(pPntBuffer[3*i],
                                       pPntBuffer[3*i+1],
                                                   pPntBuffer[3*i+2]);
                pFace->setXXXX(...);
                ... ...
                pBTR->appendAcDbEntity(pFace);
                acTransactionManagerPtr()->addNewlyCreatedDBRObject(pFace);
        }
        acTransactionManagerPtr()->endTransaction();
        pBTR->close();
}
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-15 16:42 , Processed in 0.175379 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表