找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1113|回复: 3

[求助]:如何将DWG中的文字批量更改

[复制链接]
发表于 2005-3-6 09:35:41 | 显示全部楼层 |阅读模式

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

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

×
由于要将DWG文件中N多的文字进行翻译, 想到了先将所有的文字全部导出到一文本文件中(已实现,代码如下)

//导出DWG文件中的文字串

void CTransTextDlg::OnBtExportText()
{
// TOD Add your control notification handler code here
AcDbDatabase* pDb;
AcDbBlockTable *pBlockTable;
pDb = acdbHostApplicationServices()->workingDatabase();
pDb->getSymbolTable(pBlockTable, AcDb::kForRead);

AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForRead);
pBlockTable->close();

AcDbBlockTableRecordIterator *pBlockIterator;
pBlockTableRecord->newIterator(pBlockIterator);

//打开文件用于输出
CString szFilter=_T("Data Files (*.dat;*.txt)|*.dat; *.txt|All Files (*.*)|*.*||");
CString szDefExt(_T(".DAT"));
CAcUiFileDialog dlg(FALSE, szDefExt, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
dlg.DoModal();
CString strFileName;
strFileName = dlg.GetFileName();
ofstream out(strFileName);
if(!out)
{
MessageBox("指定导出文件无法打开!");
return;
}

//设置计数器
LONG lCounts = 0;
for (; !pBlockIterator->done(); pBlockIterator->step())
{
AcDbEntity *pEntity;
pBlockIterator->getEntity(pEntity, AcDb::kForRead);

const char *pCname = pEntity->isA()->name();

if(!strcmp(pCname, "AcDbText")) //是单行文字类
{
//获取文字内容
lCounts++;
const char *pText = ((AcDbText*)pEntity)->textString();
out<objectId()<<",\t"< }
else if(!strcmp(pCname, "AcDbMText")) //是多行文字类
{
lCounts++;
const char *pMText = ((AcDbMText*)pEntity)->contents();
out<objectId()<<",\t"< if(pMText)
pMText = NULL;
}
pEntity->close();
}
out.close();
delete pBlockIterator;
pBlockTableRecord->close();
}

翻译后欲重新导入原DWG文件中, 如下:

void CTransTextDlg::OnBtSubsTexts()
{
// TOD Add your control notification handler code here
//打开文件用于输出
AcDbDatabase* pDb;
AcDbBlockTable *pBlockTable;
pDb = acdbHostApplicationServices()->workingDatabase();
pDb->getBlockTable(pBlockTable, AcDb::kForRead);

AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForRead);
pBlockTable->close();
AcDbBlockTableRecordIterator *pBlockIterator;
pBlockTableRecord->newIterator(pBlockIterator);


CString szFilter=_T("Data Files (*.dat;*.txt)|*.dat; *.txt|All Files (*.*)|*.*||");
CString szDefExt(_T(".DAT"));
CAcUiFileDialog dlg(TRUE, szDefExt, NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
dlg.DoModal();
CString strFileName;
strFileName = dlg.GetFileName();
ifstream in(strFileName);
if(!in)
{
MessageBox("指定导入文件无法打开!");
return;
}

//设置计数器
LONG lCounts = 0;
LONG lID;
for (; !pBlockIterator->done(); pBlockIterator->step())
{
AcDbEntity *pEntity;

Acad::ErrorStatus es;
es = pBlockIterator->getEntity(pEntity, AcDb::kForRead);
switch(es)
{
case Acad::eOk:
acutPrintf("Acad::eOk\n");
break;
case Acad::ePermanentlyErased:
acutPrintf("Acad::ePermanentlyErased\n");
break;
case Acad::eAtMaxReaders:
acutPrintf("Acad::eAtMaxReaders\n");
break;
case Acad::eWasOpenForNotify:
acutPrintf("Acad::eWasOpenForNotify\n");
break;
case Acad::eWasNotifying:
acutPrintf("Acad::eWasNotifying\n");
break;
case Acad::eWasOpenForUnd
acutPrintf("Acad::eWasOpenForUndo\n");
break;
case Acad::eWasOpenForWrite:
acutPrintf("Acad::eWasOpenForWrite\n");
break;
case Acad::eWasOpenForRead:
acutPrintf("Acad::eWasOpenForRead\n");
break;
default:
acutPrintf("Unknown error type.\n");
break;
}

const char *pCname = pEntity->isA()->name();

if(!strcmp(pCname, "AcDbText")) //是单行文字类
{
//获取文字内容
acutPrintf("Step -- %ld\n", 4+lCounts);
lCounts++;
char inStr[256];
in>>lID>>inStr;
((AcDbText*)pEntity)->setTextString(inStr);
}
else if(!strcmp(pCname, "AcDbMText")) //是多行文字类
{
lCounts++;
char inStr[1024];
in>>lID>>inStr;
((AcDbMText*)pEntity)->setContents(inStr);
}
pEntity->close();
}
in.close();
delete pBlockIterator;
pBlockTableRecord->close();
}

可却有错! 请教了!!!

EMAIL: yuleyue@yahoo.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-3-6 10:49:44 | 显示全部楼层
两种方式“
1,导出实体的handle,通过handle的对应关系进行导入。
2,在实体上添加信息,可以是xdata或者xrecord,然后根据添加的信息进行对应的导入导出。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-6 13:32:32 | 显示全部楼层
谢谢了,第一种方式中,是否如下:
void XXX
{
        char handleStr[20];                                                //句柄串
        char newText[1024];                                                //新字串
        ads_name entres;                                                //
    AcDbEntity* pEnt;                                                //
    AcDbObjectId objId;
        ifstream in("XXXX");                                        //包含编辑后内容的文本, 顺序与导出时一致
        while(!in.eof())
        {
                in>>handleStr>>newText;                                //从打开的文本文件流中导入上述二字串
                acdbHandEnt(handleStr, entres);                //找到实体名
                acdbGetObjectId(objId, entres);                //根据实体名找到ID
                acdbOpenAcDbEntity(pEnt, objId, Acad::eForWrite);                //打开ID所对应的实体用于写操作

                const char *pCname = pEnt->isA()->name();                //实体所属类名

                if(!strcmp(pCname, "AcDbText"))        //单行文字类
                {
                        ((AcDbText*)pEnt)->setTextString(newText);        //替换原有字串
                }
                if(!strcmp(pCname, "AcDbMText"))        //多行文字类
                {
                        ((AcDbMText*)pEnt)->setContents(newText);        //替换原有字串
                }
                pEnt->close();
        }
        in.close();
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-7 09:23:58 | 显示全部楼层
还有一种方法,用长事务类可以实现,并且留下bak文件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-30 01:32 , Processed in 0.402441 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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