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 }