gxiaofeng 发表于 2002-12-14 22:09:00

[求助]

-------------------------------------------
本人想批量处理Dwg,如清除图内垃圾信息但不知如何使用purge()请高手指点!!谢了!
AcDbDataBase *pDb=new AcDbDataBase(…);
然后用 pDb->readDwgFile()
清除图内垃圾
pDb->purge()
最后将运行pDb->save(),
再运行delete pDb

leeyeafu 发表于 2002-12-16 11:36:00

AcDbDataBase::purge()的使用

(我认为,除purge()以外的工作你应该能够完成,否则,你不应该开始使用ARX编程,应该学习ARX数据库操作基本知识。)
AcDbDataBase::purge()的完整语法:
Acad::ErrorStatus AcDbDataBase::purge(AcDbObjectIdArray& ids) const;
ids为函数所需的要操作的对象ID数组,根据你的需要,应该把数据库中所有的对象添加到该数组中。可以添加一个块表记录浏览器,遍历数据库块表,并将实体添加到数组中。具体这样做:
void DoPurge(void)
{
AcDbDataBase *pDb=new AcDbDataBase(…);
然后用 pDb->readDwgFile()
AcDbBlockTable *pBlockTable;
pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
      AcDb::kForWrite);
pBlockTable->close();
AcDbBlockRecordIterator *pBlkRcdItr;//块表记录浏览器
pBlockTable->newIterator(pBlkRcdItr);
AcDbEntity * pEnt;
AcDbObjectIdArray idArr;
for(pBlkRcdItr->start();!pBlkRcdItr->done();pBlkRcdItr->step())
{
   pBlkRcdItr->getEntity(pEnt,AcDb::kForWrite);
   idArr.append(pEnt);//向数组添加实体
   pEnt->close();
   }
   pDb->purge(idArr);    //清理垃圾
   pBlkRcdItr->close();
   
最后将运行pDb->save(),
再运行delete pDb
}

Gxiaofeng 发表于 2002-12-17 16:28:00

THANKS!但还有两个问题......

本帖最后由 作者 于 2002-12-17 16:28:06 编辑

非常感谢版主席的回复。我一定会继续努力学习ARX.谢谢!!
    但我有两个问题:
      1.你定义idArr是一个实体ID数组而pEnt定义的是一个实体类型不可能加到ID数组里的?
      2.当遍历数据库块表的时候只是遍历实体怎么可能清除掉图内没用到的线形、块、层等信息?
      请版主回复谢谢!


[此贴子已经被作者于2002-12-17 15:31:14编辑过]

leeyeafu 发表于 2002-12-18 07:58:00

Re:

第一个问题,是我粗心,SRY。应该这样:
AcDbObjectId *id;
for(......)
{
pBlkRcdItr->getEntity(pEnt,AcDb::kForWrite);
pEnt->getEntityId(id);
idArr.append(id);
pEnt->close();
}
......
第二个问题,可用遍历九个符号表的方法,类似块表操作来实现purge。我不知道是否有更好的方法,希望有。

Gxiaofeng 发表于 2002-12-18 16:31:00

非常感谢!!

非常感谢!!文字
页: [1]
查看完整版本: [求助]