找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 616|回复: 0

[ARX程序]:OBJECTARX编程中如何改变DWG中文字内容

[复制链接]
发表于 2005-3-5 23:23:53 | 显示全部楼层 |阅读模式

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

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

×
由于要将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<<pEntity->objectId()<<",\t"<<pText<<endl;
  }
  else if(!strcmp(pCname, "AcDbMText")) //是多行文字类
  {
   lCounts++;
   const char *pMText = ((AcDbMText*)pEntity)->contents();
   out<<pEntity->objectId()<<",\t"<<pMText<<endl;
   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豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-22 10:00 , Processed in 0.311571 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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