arx 插入图片

  1 #include <ShLwApi.h>
  2 #pragma comment(lib, "ShLwApi.lib")
  3 //插入影像图
  4 Acad::ErrorStatus insertIMGFile(AcDbObjectId& ImgId,CString strCadLayerName,CString strFilePathName,CString KeyWord,AcGePoint2d pntLeftDown,AcGePoint2d pntRightUp)
  5 {
  6 #if _MSC_VER >= 1600
  7 //一定要加载此文件,否则加载影像图时会失败
  8 if (!acrxDynamicLinker->loadModule(_T("acISMobj19.dbx"), true))
  9 {
 10 acutPrintf(_T("无法加载acISMobj19.dbx\n"));
 11 }
 12 #elif _MSC_VER >= 1500
 13 //一定要加载此文件,否则加载影像图时会失败
 14 if (!acrxDynamicLinker->loadModule(_T("acISMobj18.dbx"), true))
 15 {
 16 acutPrintf(_T("无法加载acISMobj18.dbx\n"));
 17 }
 18 #elif _MSC_VER >= 1400
 19 //一定要加载此文件,否则加载影像图时会失败
 20 if (!acrxDynamicLinker->loadModule(_T("acISMobj17.dbx"), true))
 21 {
 22 acutPrintf(_T("无法加载acISMobj17.dbx\n"));
 23 }
 24 #elif _MSC_VER >= 1300
 25 if (!acrxDynamicLinker->loadModule(_T("acISMobj16.dbx"), true))
 26 {
 27 acutPrintf(_T("无法加载acISMobj16.dbx\n"));
 28 }
 29 #else
 30 if (!acrxDynamicLinker->loadModule(_T("acISMobj15.dbx"), true))
 31 {
 32 acutPrintf(_T("无法加载acISMobj15.dbx\n"));
 33 }
 34 #endif
 35 if(strFilePathName.IsEmpty())
 36 return Acad::eInvalidInput;
 37 if(KeyWord.IsEmpty())
 38 {
 39 KeyWord = PathFindFileName(strFilePathName);
 40 }
 41 if(KeyWord.IsEmpty())//该影像已经加载
 42 {
 43 return Acad::eInvalidInput;
 44 }
 45 AcDbDictionary* pDictionary;
 46 Adesk::Boolean bNameInUse;
 47 AcDbObjectId DictionaryId;
 48 AcDbObjectId RasterImgDefId;
 49 AcDbObjectId RasterImgId;
 50 AcDbRasterImageDef* pAcDbRasterImageDef;
 51 Acad::ErrorStatus es;
 52 
 53 //找到当前数据库的imageDictionary
 54 DictionaryId=AcDbRasterImageDef::imageDictionary(acdbHostApplicationServices()->workingDatabase());
 55 if(!DictionaryId.isValid())
 56 {
 57 //该词典还未创建
 58 es = AcDbRasterImageDef::createImageDictionary(acdbHostApplicationServices()->workingDatabase(),DictionaryId);
 59 if(es!=Acad::eOk)
 60 {
 61 return es;
 62 }
 63 }
 64 
 65 //打开词典
 66 es = acdbOpenObject((AcDbObject*&)pDictionary,DictionaryId,AcDb::kForWrite);
 67 if(es!=Acad::eOk)
 68 {
 69 return es;
 70 }
 71 
 72 bNameInUse=pDictionary->has(KeyWord);
 73 //如果词典中不存在该影像
 74 if(!bNameInUse)
 75 {
 76 pAcDbRasterImageDef=new AcDbRasterImageDef;
 77 es = pAcDbRasterImageDef->setSourceFileName(strFilePathName);
 78 if(es!=Acad::eOk)
 79 {
 80 pDictionary->close();
 81 return es;
 82 }
 83 
 84 es = pAcDbRasterImageDef->load();
 85 if(es!=Acad::eOk)
 86 {
 87 pDictionary->close();
 88 return es;
 89 }
 90 es = pDictionary->setAt(KeyWord,pAcDbRasterImageDef,RasterImgDefId);
 91 if(es!=Acad::eOk)
 92 {
 93 pDictionary->close();
 94 return es;
 95 }
 96 pAcDbRasterImageDef->close();
 97 }
 98 else
 99 pDictionary->getAt(KeyWord,RasterImgDefId);
100 pDictionary->close();
101 
102 //设置插入点以及宽度和高度
103 AcDbRasterImage *pRasterImg=new AcDbRasterImage();
104 AcGeVector3d CorVert,HigVert;
105 CorVert.x=pntRightUp.x-pntLeftDown.x;
106 CorVert.y=0;
107 CorVert.z=0;
108 HigVert.x=0;
109 HigVert.y=pntRightUp.y-pntLeftDown.y;
110 HigVert.z=0;
111 pRasterImg->setImageDefId(RasterImgDefId);
112 pRasterImg->setOrientation(AcGePoint3d(pntLeftDown.x,pntLeftDown.y,0),CorVert,HigVert);
113 pRasterImg->setDisplayOpt(AcDbRasterImage::kTransparent , Adesk::kTrue);
114 es=pRasterImg->setLayer(strCadLayerName);
115 if(es!=Acad::eOk)
116 {
117 pRasterImg->close();
118 return es;
119 }
120 
121 //添加到数据库
122 AcDbDatabase *pDb=acdbHostApplicationServices()->workingDatabase();
123 AcDbBlockTable *pBt=NULL;
124 AcDbBlockTableRecord *pRc=NULL;
125 es=pDb->getBlockTable(pBt,AcDb::kForRead);
126 if(es!=Acad::eOk)
127 {
128 pRasterImg->close();
129 return es;
130 }
131 es=pBt->getAt(ACDB_MODEL_SPACE,pRc,AcDb::kForWrite);
132 if (es!=Acad::eOk)
133 {
134 pBt->close();
135 pBt=NULL;
136 pRasterImg->close();
137 return es;
138 }
139 
140 Acad::ErrorStatus result=pRc->appendAcDbEntity(RasterImgId,pRasterImg);
141 if(result!=Acad::eOk)
142 {
143 pRc->close();
144 pBt->close();
145 pRasterImg->close();
146 return es;
147 }
148 ImgId=RasterImgId;
149 
150 pRc->close();
151 pBt->close();
152 pRasterImg->close();
153 return es;
154 }
View Code

 

转载于:https://www.cnblogs.com/xzh1993/p/5250440.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我不懂你在说什么,但是我可以告诉你有关arx和dxf文件的一些信息。Arx是AutoCAD的开发技术,它可以帮助您在AutoCAD中轻松地创建和管理实体。Dxf文件是一种专门用于AutoCAD的文件格式,它可以用来存储AutoCAD的几何图形和实体。要编写代码以批量插入dxf文件,您需要了解AutoCAD的API,并使用该API编写代码实现批量插入的功能。 ### 回答2: ARX是AutoCAD的应用程序接口,通过使用ARX,可以用C++开发插件程序,实现自动化操作和功能扩展。 实现ARX批量插入DXF文件的代码可以按照以下步骤进行编写: 1. 引入必要的头文件 首先,在代码中引入必要的头文件,包括包含AutoCAD的头文件和ARX编程的头文件。 2. 创建插入函数 创建一个函数,该函数用于批量插入DXF文件。函数可以定义如下: ```cpp void BatchInsertDxfFiles() { //定义一个DXF文件路径的数组,包含需要插入的所有DXF文件的路径 const char* dxfFiles[] = {"/path/to/dxf1.dxf", "/path/to/dxf2.dxf", "/path/to/dxf3.dxf"}; //获取当前数据库 acdbHostApplicationServices()->workingDatabase(); //开始事务处理 acdbTransactionManager->startTransaction(); //遍历DXF文件路径数组 for (int i = 0; i < sizeof(dxfFiles) / sizeof(dxfFiles[0]); i++) { //定义一个DXF文件路径 const char* dxfFilePath = dxfFiles[i]; //创建一个数据库对象,用于读取DXF文件 AcDbDatabase* sourceDb = new AcDbDatabase(false, true); //读取DXF文件 if (sourceDb->readDwgFile(dxfFilePath) != Acad::eOk) { acutPrintf("Failed to read DXF file: %s\n", dxfFilePath); continue; } //获取当前数据库对象的块表 AcDbBlockTable* blockTable = sourceDb->getBlockTable(); //获取模型空间的块表记录 AcDbBlockTableRecord* modelSpaceRecord; blockTable->getAt(ACDB_MODEL_SPACE, modelSpaceRecord, AcDb::kForRead); //获取当前数据库的块表 AcDbBlockTable* destBlockTable = acdbHostApplicationServices()->workingDatabase()->getBlockTable(); //将模型空间的块表记录复制到当前数据库的块表中 AcDbBlockTableRecord* destModelSpaceRecord; destBlockTable->getAt(ACDB_MODEL_SPACE, destModelSpaceRecord, AcDb::kForWrite); destModelSpaceRecord->deepCloneObjects(modelSpaceRecord->objectId(), destModelSpaceRecord->objectId()); //释放资源 delete sourceDb; modelSpaceRecord->close(); destModelSpaceRecord->close(); } //提交事务处理 acdbTransactionManager->endTransaction(); } ``` 3. 注册命令函数 在代码中注册函数为AutoCAD的命令函数,使得我们可以在AutoCAD的命令行中使用该命令。可以使用acedRegCmds命令进行注册,代码示例: ```cpp void initApp() { // ...省略部分代码... //注册命令函数 acedRegCmds->addCommand("MYCOMMANDS", "MYBATCHINSERTDXF", "BATCHINSERTDXF", ACRX_CMD_MODAL, BatchInsertDxfFiles); } void unloadApp() { // ...省略部分代码... //卸载命令函数 acedRegCmds->removeGroup("MYCOMMANDS"); } ``` 4. 编译、加载和运行 将编写的代码进行编译生成ARX插件,将插件加载到AutoCAD中,并输入命令“MYBATCHINSERTDXF”进行批量插入DXF文件的操作。 以上是一个使用ARX编写的批量插入DXF文件的代码示例,实现了通过ARX批量插入DXF文件的功能。具体的代码可以根据实际需求进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值