peterchang 发表于 2005-6-4 16:53:00

大家好 请过来看看下段代码有何问题(字符串替换),谢谢!

AcDbDatabase* pDb = new AcDbDatabase(false, true);
                       pDb->readDwgFile(File);
        AcDbBlockTable *pBlockTable;
                       pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
                       AcDbBlockTableRecord *pBlockTableRecord;
                       pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
                       pBlockTable->close();
                       AcDbBlockTableRecordIterator *pBlockIterator;
                       pBlockTableRecord->newIterator(pBlockIterator);
                       for (; !pBlockIterator->done(); pBlockIterator->step())
                       {
                                                       AcDbEntity *pEntity;
                                                       pBlockIterator->getEntity(pEntity, AcDb::kForWrite);
                                                       const char *pCname = pEntity->isA()->name();
       if(!strcmp(pCname, "AcDbText"))
       {
                       const char *pText = ((AcDbText*)pEntity)->textString();
                               CString st(pText);
                               st.Replace(m_SearchStr,m_ReplaceStr);
if (((AcDbText*)pEntity)->setTextString(st) != Acad::eOk)
                       {
                                                       acutPrintf("\nSorry, that draing is probably already open.");
                                                       return;
                       }
       }
       else if(!strcmp(pCname, "AcDbMText"))
       {
               const char *pMText = ((AcDbMText*)pEntity)->contents();
               CString st(pMText);
               st.Replace(m_SearchStr,m_ReplaceStr);
               ((AcDbMText*)pEntity)->setContents(st);
               if(pMText)
                       pMText = NULL;               
       }
                                                       pEntity->close();
                       }
                       delete pBlockIterator;
                       pBlockTableRecord->close();
        pDb->saveAs(File);
delete pDb;
其他代码省略,我在运行后,一般DWG文件能够正常替换,但有个别文件不能够替换,报出致命错误:“内部错误 ",调试过程中发现问题出在“((AcDbText*)pEntity)->setTextString(st)”,但为何有的文件又能够替成功呢,请大家指教,谢谢!**** Hidden Message *****

chenpool 发表于 2005-6-4 17:19:00

我试了一下,就没什么错误。。。
如果你要读取的文件已经在CAD中打开了,运行就会有错误,你应该注意到这个问题吧???

peterchang 发表于 2005-6-6 08:20:00

不是这个原因,同样不能替换的文件,操作几次,乃至单独替换都不行
,而其他文件又可以,真不知道什莫原因,拜托大家了!

peterchang 发表于 2005-6-6 08:22:00

不能替换的文件如下:举一例:

peterchang 发表于 2005-6-6 08:23:00

大家能不能试一试,看看!

pandoram 发表于 2005-6-6 10:52:00

。。。我猜是因为前面打开块表和遍历打开实体的时候都没有检查可能不回返eOk,后面就堆积错误。。
虽然没看出来为什么,但是至少可以考虑在所有的操作上都检查回返值,确定最先出错的是什么地方。。

peterchang 发表于 2005-6-6 11:02:00

我通过查找能够替换和不能够替换的DWG文件得到了答案:原来竟然是图纸中有一图层:ASHADE层是否被锁,只要打开,就可以正常替换,可我所替换的文字不再此层啊,为啥?
怎样用ARX设置此层被打开,谢谢!

pandoram 发表于 2005-6-6 11:17:00

。。果然。。
代码遍历Model Space的时候对每一个实体进行写打开,因为处在被锁的图层上的实体是不能修改的,所以写打开操作很可能回返了错误,但是代码没有处理错误,内部堆积到后面就暴走。。
果然对所有的打开操作都是要检查检查再检查的。。
只为了修改文字而把图层解锁不好吧,建议楼主遍历的时候先以读打开,检查实体类型,如果是文字实体再upgradeToWrite。。

peterchang 发表于 2005-6-6 11:44:00

我明白了!谢谢!
页: [1]
查看完整版本: 大家好 请过来看看下段代码有何问题(字符串替换),谢谢!