明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1847|回复: 4

acdbtext如何加入AcDbDatabase

[复制链接]
发表于 2013-6-24 15:13 | 显示全部楼层 |阅读模式
本帖最后由 BDYCAD 于 2013-6-24 15:27 编辑

  1. //InObjIDList为输出对象ID表
  2. //fileName为输出文件名称,格式如_T("C:\\abc.dwg")
  3. bool acdbSaveAsR14Dwg(AcDbObjectIdArray InObjIDList,const ACHAR* fileName){
  4. if (InObjIDList.length()==0)return FALSE;//没有对象,所以不往下远行程序,防止输出空文档
  5. AcDbDatabase *pDb = new AcDbDatabase();
  6. AcDbBlockTable *pBtbl;
  7. pDb->getSymbolTable(pBtbl, AcDb::kForRead);
  8. AcDbBlockTableRecord *pBtblRcd;
  9. pBtbl->getAt(ACDB_MODEL_SPACE, pBtblRcd,AcDb::kForWrite);
  10. pBtbl->close();
  11. AcDbObjectId ObjID;
  12. AcDbEntity *pEnt;
  13. AcGeMatrix3d xform1;
  14. AcGePoint3d ptStart(0,0,0), ptEnd(0,0,0);
  15. xform1.setTranslation(AcGeVector3d(ptEnd-ptStart));
  16. AcDbObjectId layid;
  17. AcDbLayerTable *pLayerTbl; //先声明一个空的层表指针
  18. pDb->getSymbolTable(pLayerTbl,AcDb::kForWrite);//当前图形数据库打开层表为写入状态
  19. AcDbLayerTableRecord *pLayerTblRcd= new AcDbLayerTableRecord();//笔线层表记录
  20. pLayerTblRcd->setName(_T("1")); //设定图层名
  21. pLayerTblRcd->setIsFrozen(0); // 图层解冻
  22. pLayerTblRcd->setIsOff(0); // 打开图层
  23. pLayerTblRcd->setVPDFLT(0); // 使用默认视口
  24. pLayerTblRcd->setIsLocked(0 ); // 图层解锁
  25. AcCmColor color; // AcCmColor是ACAD颜色管理类
  26. color.setColorIndex(1);// 图层颜色为红色  
  27. pLayerTblRcd->setColor(color);
  28. pLayerTbl->add(pLayerTblRcd);
  29. pLayerTblRcd->close();
  30. pLayerTblRcd=new AcDbLayerTableRecord();//中心线层表记录
  31. pLayerTblRcd->setName(_T("2")); //设定图层名
  32. pLayerTblRcd->setIsFrozen(0); // 图层解冻
  33. pLayerTblRcd->setIsOff(0); // 打开图层
  34. pLayerTblRcd->setVPDFLT(0); // 使用默认视口
  35. pLayerTblRcd->setIsLocked(0 ); // 图层解锁
  36. color.setColorIndex(7);// 图层颜色为黑色
  37. pLayerTblRcd->setColor(color);
  38. pLayerTbl->add(pLayerTblRcd);
  39. pLayerTblRcd->close();
  40. pLayerTblRcd=new AcDbLayerTableRecord();//线槽层表记录
  41. pLayerTblRcd->setName(_T("5")); //设定图层名
  42. pLayerTblRcd->setIsFrozen(0); // 图层解冻
  43. pLayerTblRcd->setIsOff(0); // 打开图层
  44. pLayerTblRcd->setVPDFLT(0); // 使用默认视口
  45. pLayerTblRcd->setIsLocked(0 ); // 图层解锁
  46. color.setColorIndex(5);// 图层颜色为黑色
  47. pLayerTblRcd->setColor(color);
  48. pLayerTbl->add(pLayerTblRcd);
  49. pLayerTblRcd->close();
  50. pLayerTbl->close();
  51. AcGePoint3dArray PointList;
  52. for (int i=0;InObjIDList.length()>i;i++)
  53. {
  54.   ObjID=InObjIDList.at(i);
  55.   if (acdbOpenObject(pEnt,ObjID,AcDb::kForWrite)!=Acad::eOk)continue;
  56.   const ACHAR *ObjNameChar=pEnt->isA()->name();
  57.   const ACHAR *ObjLayer=pEnt->layer();
  58.   PointList.removeAll();
  59.   pEnt->getStretchPoints(PointList);
  60.   pEnt->close();
  61.   if (!_tcscmp(ObjNameChar,_T("AcDbLine")))
  62.   {
  63.    AcDbLine *newEnt=new AcDbLine(PointList.first(),PointList.last());
  64.    pBtblRcd->appendAcDbEntity(newEnt);
  65.    newEnt->setLayer(ObjLayer);
  66.    newEnt->close();
  67.   }
  68.   if (!_tcscmp(ObjNameChar,_T("AcDbPolyline"))||
  69.    !_tcscmp(ObjNameChar,_T("AcDb2dPolyline")))
  70.   {
  71.    AcDb2dPolyline *newEnt=new AcDb2dPolyline(AcDb::k2dSimplePoly,PointList,0.0,Adesk::kFalse);
  72.    pBtblRcd->appendAcDbEntity(newEnt);
  73.    newEnt->setLayer(ObjLayer);
  74.    newEnt->close();
  75.   }
  76.   if (!_tcscmp(ObjNameChar,_T("AcDbCircle")))
  77.   {
  78.    AcDbCircle *pCir;
  79.    if (acdbOpenObject(pCir,ObjID,AcDb::kForWrite)==Acad::eOk)
  80.    {
  81.     AcGePoint3d Cpt=pCir->center();
  82.     ads_real Radius=pCir->radius();
  83.     pCir->close();
  84.     pCir=new AcDbCircle();
  85.     pCir->setCenter(Cpt);
  86.     pCir->setRadius(Radius);
  87.     pCir->setLayer(ObjLayer);
  88.     pBtblRcd->appendAcDbEntity(pCir);
  89.     pCir->close();
  90.    }
  91.   }
  92.   if (!_tcscmp(ObjNameChar,_T("AcDbText")))
  93.   {
  94.    AcDbText *pText;
  95.    if (acdbOpenObject(pText,ObjID,AcDb::kForWrite)==Acad::eOk)
  96.    {
  97.     ACHAR TextChar[MAX_PATH],LayerChar[MAX_PATH];
  98.     ads_real TextHigth=pText->height();
  99.     _tcscpy(TextChar,pText->textString());
  100.     AcGePoint3d Cpt=pText->position();
  101.     AcDbObjectId TSid=pText->textStyle();
  102.     pText->close();
  103.     pText=new AcDbText();
  104.     pText->setLayer(ObjLayer);
  105.     pText->setTextString(TextChar);
  106.     pText->setHeight(TextHigth);
  107.     pText->setHorizontalMode(AcDb::kTextCenter);
  108.     pText->setTextStyle(TSid);
  109.     pText->setLayer(ObjLayer);
  110.     //te->setVerticalMode(AcDb::kTextVertMid);
  111.     pText->setAlignmentPoint(Cpt);
  112.     AcDbBlockTable *blocktable;
  113.     acdbHostApplicationServices()->workingDatabase()->getSymbolTable(blocktable,AcDb::kForRead);
  114.     pDb->getSymbolTable(blocktable,AcDb::kForRead);
  115.     AcDbBlockTableRecord *blocktablerecord;
  116.     blocktable->getAt(ACDB_MODEL_SPACE,blocktablerecord,AcDb::kForWrite);
  117.     blocktablerecord->appendAcDbEntity(pText);
  118.     pBtblRcd->appendAcDbEntity(pText);
  119.     blocktable->close();
  120.     blocktablerecord->close();
  121.     pText->close();
  122.    }
  123.   }
  124. }
  125. pBtblRcd->close();
  126. pDb->saveAs(fileName, false, AcDb::kDHL_1014);
  127. delete pDb;
  128. return TRUE;
  129. }
复制代码
如上代我近来正在写的代码。是把对象输出一个DWG文件,但是文字输不出,请高手指点一下我,怎么写才对??
发表于 2013-6-24 19:32 | 显示全部楼层
测试中 明天给您答复
发表于 2013-10-13 18:23 | 显示全部楼层
286168051 发表于 2013-6-24 19:32
测试中 明天给您答复

有答案吗,我也想知道
发表于 2013-10-24 16:27 | 显示全部楼层
看来没人肯回答阿。
那我来把

1,运行时识别,直接用下面的

  1. if (pEnt->isKindof( AcDbText::desc ) )//判断实体是不是acdbtext,其他对象同此操作
  2. {....}
复制代码
2,你这个是将选中的代码另存为一个dwg,直接使用pNewEnt = pEnt->clone(),来在内存中创建一个与pEnt一模一样的对象。其余不用变。
 楼主| 发表于 2013-11-6 14:00 | 显示全部楼层
感 谢楼上大侠:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-4 14:24 , Processed in 0.587998 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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