找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7441|回复: 7

[求助] 关于如何创建AcDbWipeout的问题

[复制链接]
发表于 2014-3-31 21:44:11 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Lisper 于 2014-4-1 13:15 编辑

想要arx创建wipeout,写了代码如下:
  1. #include "dbwipe.h"
  2. //创建WipeOut
  3. int MakeWipeOut(void)
  4. {
  5.   Acad::ErrorStatus es;
  6.   struct resbuf *rb = acedGetArgs();
  7.   if (rb == NULL)
  8.   {
  9.     acdbFail(_T("错误: 参数太少\n"));
  10.     return RTERROR;
  11.   }
  12.   AcGeTol tol;
  13.   tol.setEqualPoint(1e-6);
  14.   AcGePoint3dArray points;
  15.   AcGePoint2dArray point2ds;
  16.   int rc = CCommonSub::GetDataFromRb(rb,points);
  17.   if (rc != RTNORM)
  18.   {
  19.     acdbFail(_T("错误: 参数错误\n"));
  20.     return RTERROR;
  21.   }
  22.   if (rb != NULL)
  23.   {
  24.     acdbFail(_T("错误: 参数太多\n"));
  25.     return RTERROR;
  26.   }
  27.   if (!points.at(0).isEqualTo(points.last(),tol))
  28.   {
  29.     points.append(points.at(0));
  30.   }
  31.   point2ds = CCalculation::Pt3dTo2d(points);
  32.   es = AcDbWipeout::createImageDefinition();
  33.   AcDbWipeout *pWipeout = new AcDbWipeout;
  34.   if(pWipeout == NULL) return RTERROR;
  35.   pWipeout->setDatabaseDefaults();
  36. AcGePoint3d originPnt(AcGePoint3d::kOrigin);
  37.   AcGeVector3d Udirection(1,0,0);
  38.   AcGeVector3d Vdirection(0,-1,0);
  39. pWipeout->setOrientation(originPnt,Udirection, Vdirection);
  40.   pWipeout->setDisplayOpt(AcDbRasterImage::kTransparent,Adesk::kTrue);
  41.   pWipeout->setDisplayOpt( AcDbRasterImage::kShow, true);
  42.   es = pWipeout->setClipBoundaryToWholeImage();
  43.   es = pWipeout->setClipBoundary(AcDbRasterImage::kPoly,point2ds);
  44.   AcDbObjectId id;
  45.   id = pWipeout->objectId();
  46.   pWipeout->close();
  47.   ads_name en;
  48.   acdbGetAdsName(en,id);
  49.   acedRetName(en,RTENAME);
  50.   return (RSRSLT);
  51. }



编译时提示:
acrxEntryPoint.obj : error LNK2001: 无法解析的外部符号 "public: virtual class AcGeVector2d __thiscall AcDbWipeout::scale(void)const " (?scale@AcDbWipeout@@UBE?AVAcGeVector2d@@XZ)
1>acrxEntryPoint.obj : error LNK2001: 无法解析的外部符号 "public: virtual char __thiscall AcDbWipeout::fade(void)const " (?fade@AcDbWipeout@@UBEDXZ)

......
所有关于AcDbWipeout::xxx的函数都提示:无法解析的外部符号
是什么原因啊?
我编译时的附加依赖项是:acad.lib
acui17.lib
adui17.lib
acdb17.lib
acge17.lib
acgiapi.lib
rxapi.lib
acISMobj17.lib
是还需要附加链接什么库文件吗?

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

已领礼包: 13个

财富等级: 恭喜发财

发表于 2014-4-1 09:44:19 | 显示全部楼层
你ARX在什么版本下编译的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2014-4-1 09:56:53 | 显示全部楼层
加个 AcWipeoutObj17.lib 就欧了。

点评

R17找不到库文件AcWipeoutObj17.lib,在R18上测试成功! AcWipeoutObj17.lib去哪找呢?arx2008不自带么? 另外再请教一下,在arx2004上又该如何创建wipeout呢?  详情 回复 发表于 2014-4-1 13:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-1 13:18:37 | 显示全部楼层
LoveArx 发表于 2014-4-1 09:56
加个 AcWipeoutObj17.lib 就欧了。

R17找不到库文件AcWipeoutObj17.lib,在R18上测试成功!
AcWipeoutObj17.lib去哪找呢?arx2008不自带么?
另外再请教一下,在arx2004上又该如何创建wipeout呢?

点评

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

使用道具 举报

 楼主| 发表于 2014-4-1 18:50:19 | 显示全部楼层
R18以下没有AcWipeoutObj17.lib AcWipeoutObj16.lib库文件,现已解决,以下代码在2004~2013编译测试成功!
  1. //创建WipeOut对象
  2. #if (ADS > 17)
  3. Acad::ErrorStatus CCreateEnt::CreateWipeout (AcDbObjectId &wipeoutId,AcGePoint2dArray point2ds)
  4. {
  5.    Acad::ErrorStatus es;
  6. #if (ADS>18)
  7.    if (RTNORM != acedArxLoad(_T("acismui.arx"))) return Acad::eNotImplementedYet;
  8. #else
  9.    if (RTNORM != acedArxLoad(_T("acwipeout.arx"))) return Acad::eNotImplementedYet;
  10. #endif
  11.    
  12.    es = AcDbWipeout::createImageDefinition();
  13.    if (es != Acad::eOk)
  14.    {
  15.      return es;
  16.    }
  17.    if (!point2ds.at(0).isEqualTo(point2ds.last()))
  18.    {
  19.      point2ds.append(point2ds.at(0));
  20.    }
  21.   AcDbWipeout *pWipeout = new AcDbWipeout;
  22.   if(pWipeout == NULL) return Acad::eNotImplementedYet;
  23.   pWipeout->setDatabaseDefaults();
  24.   AcGePoint3d originPnt(AcGePoint3d::kOrigin);
  25.   AcGeVector3d Udirection(1,0,0);
  26.   AcGeVector3d Vdirection(0,-1,0);
  27.   pWipeout->setOrientation(originPnt,Udirection, Vdirection);

  28.   pWipeout->setDisplayOpt(AcDbRasterImage::kTransparent,Adesk::kTrue);
  29.   pWipeout->setDisplayOpt( AcDbRasterImage::kShow, true);
  30.   es = pWipeout->setClipBoundaryToWholeImage();
  31.   AcGePoint2d pt2d;
  32.   double scale;
  33.   es = pWipeout->fitPointsToImage(point2ds,pt2d,scale,0);
  34.   AcDbObjectId id;
  35.    pWipeout->append(id);
  36.   wipeoutId = pWipeout->objectId();
  37.   pWipeout->close();
  38.   return Acad::eOk;
  39. }
  40. Acad::ErrorStatus CCreateEnt::CreateWipeout (AcDbObjectId &wipeoutId,AcGePoint3dArray point3ds)
  41. {
  42.   
  43.    AcGePoint2dArray point2ds = CCalculation::Pt3dTo2d(point3ds);
  44.    return CreateWipeout(wipeoutId,point2ds);
  45. }
  46. #else
  47. Acad::ErrorStatus CCreateEnt::CreateWipeout (AcDbObjectId &wipeoutId,AcGePoint3dArray point3ds)
  48. {
  49.    if (!point3ds.at(0).isEqualTo(point3ds.last()))
  50.    {
  51.      point3ds.append(point3ds.at(0));
  52.    }

  53.    if (RTNORM != acedArxLoad(_T("acwipeout.arx"))) return Acad::eNotImplementedYet;
  54.    AcRxClass* pClass = AcRxClass::cast(acrxClassDictionary->at(_T("AcDbWipeout")));
  55.    AcDbEntity *pWipeOut=(AcDbEntity *)pClass->create();
  56.    AcDbRasterImage *pImage=AcDbRasterImage::cast(pWipeOut);
  57. //   AcDbRasterImage::ClipBoundaryType        cbType;
  58.    AcGePoint3dArray exts = CCalculation::getExtentsBox(point3ds);
  59.    //AcGePoint3d originPnt(AcGePoint3d::kOrigin);
  60.   // AcGePoint3d originPnt(CCalculation::MiddlePoint(exts[0],exts[1]) );
  61.    AcGePoint3d originPnt(exts[0]);
  62.    double w = max(exts[1].x-exts[0].x,exts[1].y-exts[0].y);
  63.    AcGeVector3d Udirection(w,0,0);
  64.    AcGeVector3d Vdirection(0,w,0);
  65.    pImage->setOrientation(originPnt,Udirection, Vdirection);

  66.    AcGeMatrix3d PixelToModel,ModelToPixel;
  67.    pImage->getPixelToModelTransform(PixelToModel);
  68.    ModelToPixel=PixelToModel.invert();
  69.    for(int i=0;i< point3ds.length();i++)
  70.    {
  71.      point3ds.transformBy(ModelToPixel);
  72.    }   
  73.    AcGePoint2dArray point2ds = CCalculation::Pt3dTo2d(point3ds);
  74.    // ...设置参数
  75.    pImage->setDisplayOpt(AcDbRasterImage::kTransparent,Adesk::kTrue);
  76.    pImage->setDisplayOpt( AcDbRasterImage::kShow, true);

  77.    pImage->setClipBoundaryToWholeImage();
  78.    pImage->setClipBoundary(AcDbRasterImage::kPoly,point2ds);
  79.    pWipeOut=(AcDbEntity *)pImage;
  80.    return CCreateEnt::PostToSpace(wipeoutId,pWipeOut);
  81. }
  82. Acad::ErrorStatus CCreateEnt::CreateWipeout (AcDbObjectId &wipeoutId,AcGePoint2dArray point2ds)
  83. {
  84.    return CreateWipeout (wipeoutId,CCalculation::Pt2dTo3d(point2ds));
  85. }
  86. #endif


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

使用道具 举报

发表于 2015-7-14 15:57:26 | 显示全部楼层
学习了,正在找AcDbWipeout怎么作用,多谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2015-7-14 21:55:03 | 显示全部楼层
Lisper 发表于 2014-4-1 13:18
R17找不到库文件AcWipeoutObj17.lib,在R18上测试成功!
AcWipeoutObj17.lib去哪找呢?arx2008不自带么 ...

在低于2008下,可以用下面代码生成WIPEOUT

  1.         if (!isWipeOutLoaded())
  2.                 return Acad::eNotImplementedYet;
  3. #if (ADS1<2008)
  4.         //...确定wipeout.arx加载
  5.         AcRxClass* pClass = AcRxClass::cast(acrxClassDictionary->at(_T("AcDbWipeout")));
  6.         if (!pClass)
  7.                 return eNotImplementedYet;
  8.         AcDbEntity *pWipeOut=(AcDbEntity *)pClass->create();
  9.         AcDbRasterImage *pImage=AcDbRasterImage::cast(pWipeOut);
  10.         if (!pImage)
  11.                 return Acad::eNotImplementedYet;
  12.         AcDbPolyline *pLwpoly;
  13.         pLwpoly=XdDbUtils::makePolyFromPtArray(&clipVtx);
  14.         if (!pLwpoly)
  15.                 return Acad::eNotImplementedYet;
  16.         AcGePoint3dArray poly;
  17.         double tol=XdDbUtils::getScreenHigh()/400;
  18.         if (DocVars.docData().AES_DBASE.m_tol.equalVector()>tol)
  19.                 tol=DocVars.docData().AES_DBASE.m_tol.equalVector();
  20.         XdDbUtils::getPolyVertxFromCurve(pLwpoly,poly,tol);
  21.         AcGeCurve3d *gL;
  22.         XdDbUtils::convertDbCurveToGeCurve(pLwpoly,gL);
  23.         delete pLwpoly;
  24.         AcGeBoundBlock3d block=gL->orthoBoundBlock();
  25.         AcGePoint3d pt,origin,maxPt,minPt;
  26.         block.getMinMaxPoints(minPt,maxPt);
  27.         origin=minPt;
  28.         double x=maxPt.x-minPt.x,y=maxPt.y-minPt.y;
  29.         double max=(x<y)?y:x;
  30.         AcGeVector3d u(max,0,0),v(0,max,0);
  31.         pImage->setOrientation(origin, u, v);
  32.         pImage->setClipBoundaryToWholeImage();
  33.         AcGeMatrix3d PixelToModel,ModelToPixel;
  34.         pImage->getPixelToModelTransform(PixelToModel);
  35.         ModelToPixel=PixelToModel.inverse();
  36.         for(int i=0;i<poly.length();i++)
  37.         {
  38.                 poly.transformBy(ModelToPixel);
  39.         }
  40.         AcGePoint2dArray poly2d;
  41.         XdGeUtils::trans3DTo2D(&poly,poly2d);
  42.         // ...设置参数
  43.         pImage->setClipBoundary(AcDbRasterImage::kPoly,poly2d);
  44.         pWipeout=(AcDbEntity *)pImage;
  45. #else

  46. .....

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2015-7-14 21:57:34 | 显示全部楼层
  1. bool XdDbUtils::isWipeOutLoaded()
  2. {
  3.         if(!AT_loaded(_T("wipeout")))
  4.         {
  5.                 int nRet=acrxLoadModule(_T("acwipeout.arx"), Adesk::kFalse, TRUE);
  6.                 if(!nRet) {
  7.                         adsout << _T("\n请事先安装AutoCAD快捷工具或者将wipeout.arx拷贝到ACAD搜索目录!");
  8.                         return false;
  9.                 }
  10.         }
  11.         //...确定wipeout.arx加载
  12.         AcRxClass* pClass = AcRxClass::cast(acrxClassDictionary->at(_T("AcDbWipeout")));
  13.         if (!pClass)
  14.                 return false;
  15.         return true;
  16. }


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 09:08 , Processed in 0.192626 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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