明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3288|回复: 8

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

[复制链接]
发表于 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文件能够正常替换,但有个别文件不能够替换,AutoCAD报出致命错误:“内部错误 dbobji.cpp@5717:eNotOpenForWrite",调试过程中发现问题出在“((AcDbText*)pEntity)->setTextString(st)”,但为何有的文件又能够替成功呢,请大家指教,谢谢!
发表于 2005-6-4 17:19:00 | 显示全部楼层
我试了一下,就没什么错误。。。


如果你要读取的文件已经在CAD中打开了,运行就会有错误,你应该注意到这个问题吧???
 楼主| 发表于 2005-6-6 08:20:00 | 显示全部楼层
不是这个原因,同样不能替换的文件,操作几次,乃至单独替换都不行


,而其他文件又可以,真不知道什莫原因,拜托大家了!
 楼主| 发表于 2005-6-6 08:22:00 | 显示全部楼层
不能替换的文件如下:举一例:

本帖子中包含更多资源

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

x
 楼主| 发表于 2005-6-6 08:23:00 | 显示全部楼层
大家能不能试一试,看看!
发表于 2005-6-6 10:52:00 | 显示全部楼层
。。。我猜是因为前面打开块表和遍历打开实体的时候都没有检查可能不回返eOk,后面就堆积错误。。


虽然没看出来为什么,但是至少可以考虑在所有的操作上都检查回返值,确定最先出错的是什么地方。。
 楼主| 发表于 2005-6-6 11:02:00 | 显示全部楼层
我通过查找能够替换和不能够替换的DWG文件得到了答案:原来竟然是图纸中有一图层:ASHADE层是否被锁,只要打开,就可以正常替换,可我所替换的文字不再此层啊,为啥?


怎样用ARX设置此层被打开,谢谢!
发表于 2005-6-6 11:17:00 | 显示全部楼层
。。果然。。


代码遍历Model Space的时候对每一个实体进行写打开,因为处在被锁的图层上的实体是不能修改的,所以写打开操作很可能回返了错误,但是代码没有处理错误,内部堆积到后面就暴走。。


果然对所有的打开操作都是要检查检查再检查的。。


只为了修改文字而把图层解锁不好吧,建议楼主遍历的时候先以读打开,检查实体类型,如果是文字实体再upgradeToWrite。。
 楼主| 发表于 2005-6-6 11:44:00 | 显示全部楼层
我明白了!谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 07:34 , Processed in 0.177288 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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