找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3477|回复: 8

[求助] 在dwg图中插入图片,提示Acad::eNoClassId错误

[复制链接]
发表于 2017-1-12 14:00:13 | 显示全部楼层 |阅读模式

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

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

×
在dwg文件中插入图片的代码如下,可是运行到
Acad::ErrorStatus es = pDict->setAt(dictName, pImageDef, objId);语句的时候提示Acad::eNoClassId错误。
哪位高手有时间麻烦看一下,代码有什么错误。代码贴出来如下:
void SignalSimulate::createPicture(CString name, AcGePoint3d point1, AcGePoint3d point2){
//CString dictName = TEXT("simulate");
CString dictName = TEXT("testSimulate");
//CString fileName = UtilCom::getArxPath(name);
CString fileName = name;
loadModule();
AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
AcDbRasterImageDef* pImageDef = new AcDbRasterImageDef();
if(pImageDef->setSourceFileName(fileName) != Acad::eOk)
{
  delete pImageDef;
  return;
}
Acad::ErrorStatus es = pImageDef->load();
AcDbObjectId dictId = AcDbRasterImageDef::imageDictionary(pDb);
//AcDbObjectId dictId = AcDbObjectId::kNull;
if(AcDbRasterImageDef::createImageDictionary(pDb, dictId) != Acad::eOk)
{
  delete pImageDef;
  acutPrintf(TEXT("Could not create dictionary.\n"));
  return;
}
AcDbDictionary* pDict = NULL;
if(acdbOpenObject(pDict, dictId, AcDb::kForWrite) != Acad::eOk)
{
  delete pImageDef;
  acutPrintf(TEXT("Could not open dictionary.\n"));
  return;
}
AcDbObjectId objId;
if (pDict->has(dictName))
{
  Acad::ErrorStatus es = pDict->getAt(dictName, (AcDbObject*&) pImageDef, AcDb::kForWrite);
  objId = pImageDef->objectId();
}
else
{
  Acad::ErrorStatus es = pDict->setAt(dictName, pImageDef, objId);
  acutPrintf(TEXT("%d"),es);
}
// close Dictionary and Definition.
pDict->close();
pImageDef->close();
#if 0
ads_point pt1, pt2;
if (acedGetPoint(NULL, TEXT("仿真边界起点:\n"), pt1) != RTNORM) {
  return;
}
if (acedGetCorner(pt1, TEXT("仿真边界终点:\n"), pt2) != RTNORM) {
  return;
}
AcGePoint3d point1 = asPnt3d(pt1), point2 = asPnt3d(pt2);
#endif
AcDbRasterImage* pImage = new AcDbRasterImage();
if (pImage->setImageDefId(objId) != Acad::eOk)
{
  delete pImage;
  return;
}
AcDbObjectId modelId = acdbSymUtil()->blockModelSpaceId(pDb);
AcDbBlockTableRecord *pBTRecord;
acdbOpenAcDbObject((AcDbObject*&) pBTRecord, modelId, AcDb::kForWrite);
es = pBTRecord->appendAcDbEntity(pImage);
pBTRecord->close();
AcDbObjectId imgId = pImage->objectId();
AcGePoint3d org;
org.x = point1.x < point2.x ? point1.x : point2.x;
org.y = point1.y < point2.y ? point1.y : point2.y;
AcGePoint3d ptw(fabs(point1.x - point2.x), 0, 0), pth(0, fabs(point1.y - point2.y), 0);
if (pImage->setOrientation(org, ptw.asVector(), pth.asVector()) != Adesk::kTrue) {
  acutPrintf(TEXT("Set Orientation failed.\n"));
  pImage->close();
  return;
}
pImage->setDisplayOpt(AcDbRasterImage::kShow, Adesk::kTrue);
pImage->setDisplayOpt(AcDbRasterImage::kTransparent, Adesk::kTrue);
pImage->close();
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-1-12 14:50:38 | 显示全部楼层
看看前两天的帖子  http://bbs.xdcad.net/thread-706818-1-1.html
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-1-12 14:58:54 | 显示全部楼层
在初始化应用程序里面加载图像需要的acismobjXX.dbx文件,  xx根据版本号可能是17,18,19,20.....

virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
                // TODO: Load dependencies here
                // You *must* call On_kInitAppMsg here

#if (ADS == 18)
                acrxDynamicLinker->loadModule( L"acismobj18.dbx",true); 
#elif (ADS == 19)
                acrxDynamicLinker->loadModule(L"acismobj19.dbx",true); 
#elif (ADS >=20)
                acrxDynamicLinker->loadModule(L"acismobj20.dbx",true); 
#elif (ADS1> 2007)
                acrxDynamicLinker->loadModule(L"acismobj17.dbx",true); 
#endif
                
                AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
                //.........................
                 return (retCode) ;
}


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-13 10:16:18 | 显示全部楼层

谢谢你提供的代码。不过那个代码只是多加了反应器,其它的部分和我的代码是一样的。我的代码跑到Acad::ErrorStatus es = pDict->setAt(dictName, pImageDef, objId);这行时就出现409错误(eNoClassId错误),得不到objId值,所以后面就出错了。如果用imageAttach先插入一次图片,那么接下来这行代码就不出错了。应该是imageAttach执行了一些我的代码没执行的条件,所以导致的。
我想问的是:这个问题有人碰到过吗?应该如何解决?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-13 10:25:35 | 显示全部楼层

请问ADS是哪里的变量?看了别的代码,如下。可是我load的时候无法加载,不知道具体原因。
        #if _MSC_VER >= 1600
        if (!acrxDynamicLinker->loadModule(_T("acISMobj19.dbx"), true))
        {
            acutPrintf(_T("无法加载acISMobj19.dbx\n"));
        }
        #elif _MSC_VER >= 1500
        if (!acrxDynamicLinker->loadModule(_T("acISMobj18.dbx"), true))
        {
            acutPrintf(_T("无法加载acISMobj18.dbx\n"));
        }
        #elif _MSC_VER >= 1400
        //一定要加载此文件,否则加载影像图时会失败
        if (!acrxDynamicLinker->loadModule(_T("acISMobj17.dbx"), true))
        {
            acutPrintf(_T("无法加载acISMobj17.dbx\n"));
        }
        #elif _MSC_VER >= 1300
        if (!acrxDynamicLinker->loadModule(_T("acISMobj16.dbx"), true))
        {
            acutPrintf(_T("无法加载acISMobj16.dbx\n"));
        }
        #else
        if (!acrxDynamicLinker->loadModule(_T("acISMobj15.dbx"), true))
        {
            acutPrintf(_T("无法加载acISMobj15.dbx\n"));
        }
        #endif
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-1-13 10:41:20 | 显示全部楼层
ADS是预处理里面的常量,定义下版本号,确定CAD版本的,你要是用 _MSC_VER 能区别,就用这个,对应不同的CAD版本。

loadModule 区分大小写,你去看下CAD安装目录里面的文件名,我记得都是小写的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-13 14:34:01 | 显示全部楼层
非常感谢。问题已解决。是这个文件没有载入导致的问题。我的cad这个文件比较新,所以没有引入。是应该都是小写字符。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-1-13 14:49:03 | 显示全部楼层
本帖最后由 LoveArx 于 2017-1-13 14:51 编辑

看了你一楼的代码,发现两个问题

1、DICTNAME,你设置了固定的值,这样你只能插入一个图片,再插入就替换了。建议你用文件名做辞典名,和ACAD的IMAGEATTCH命令一样
2、
if(AcDbRasterImageDef::createImageDictionary(pDb, dictId) != Acad::eOk)
{
  delete pImageDef;
  acutPrintf(TEXT("Could not create dictionary.\n"));
  return;
}


在AcDbRasterImageDef::imageDictionary(pDb)后面加上判断dictId是否为NULL,判断图像的辞典是否已经有了,如果没有创建,否则你第二次插入图片的时候就报错退出了,插入不了新的图片。

点评

他一定要感谢你, 非常详细,非常有用,节约了我好多时间,非常感谢  发表于 2017-4-13 21:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 07:31 , Processed in 0.363841 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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