找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1080|回复: 0

[研讨] 今天遇到两个ARX奇葩问题

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2016-3-13 00:21:58 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 csharp 于 2016-3-13 08:41 编辑

环境 Windows 10 32bit + VS2008 + AutoCAD 2010

问题一: AcDbCurve::getOffsetCurves()  距离正负对 AcDbLine 竟然和其它曲线相反,其它曲线正常时,AcDbLine 结果就反了,下面是模拟 Offset 通过点偏移
  1. <div>
  2.         static double IsLeft(AcGeVector3d &A,AcGeVector3d &B)
  3.         {
  4.                 return (A.x*B.y-A.y*B.x);
  5.         }
  6. static void asdkMyGroupMyOffset()
  7.         {
  8.                 Acad::ErrorStatus es;
  9.                 ads_name ent;
  10.                 ads_point p1,p2;
  11.                 AcDbObjectId id;
  12.                 AcDbEntity *pEnt=NULL;
  13.                 AcGePoint3d pt;        
  14.                 AcGeVector3d vec;
  15.                 AcDbVoidPtrArray dbs;
  16.                 int ret=acedEntSel(L"\nPick Curve: ",ent,p1);
  17.                 if (ret!=RTNORM)
  18.                 {
  19.                         return;
  20.                 }
  21.                 do
  22.                 {
  23.                         if (RTNORM!=acedGetPoint(p1,L"\nThrough Point: ",p2))
  24.                         {
  25.                                 return;
  26.                         }
  27.                         acdbGetObjectId(id,ent);
  28.                         acdbOpenObject(pEnt,id,AcDb::kForRead);
  29.                         if (!pEnt->isKindOf(AcDbCurve::desc()))
  30.                         {
  31.                pEnt->close();
  32.                                 return;
  33.                         }
  34.                         AcDbCurve *pCurve=AcDbCurve::cast(pEnt);                                       
  35.                         es=pCurve->getClosestPointTo(asPnt3d(p2) ,pt);

  36.                         pCurve->getFirstDeriv(pt,vec);
  37.                         if (es!=Acad::eOk)
  38.                         {
  39.                                 pEnt->close();
  40.                                 return;
  41.                         }
  42.                         double dist=pt.distanceTo(asPnt3d(p2));
  43.                         if (IsLeft(asPnt3d(p2)-pt,vec) <0)
  44.                         {
  45.                                 dist*=-1;
  46.                         }
  47.                         dbs.setLogicalLength(0);
  48.                         dbs.setPhysicalLength(0);
  49.                         pCurve->getOffsetCurves(dist,dbs);//此处 AcDbLine 和其它曲线正负规则相反
  50.                         if (!dbs.isEmpty())
  51.                         {
  52.                                 AcDbBlockTableRecordPointer btr(curDoc()->database()->currentSpaceId(),AcDb::kForWrite);
  53.                                 if        (btr.openStatus()!=Acad::eOk)
  54.                                 {
  55.                                         pEnt->close();
  56.                                         return
  57.                                }
  58.                                 for (int i=0;i<dbs.logicalLength();i++)
  59.                                 {
  60.                                         AcDbEntity *pEnt1=(AcDbEntity *)dbs.at(i);
  61.                                         btr->appendAcDbEntity(pEnt1);
  62.                                         pEnt1->close();
  63.                                 }
  64.                         }
  65.                         pEnt->close();
  66.                         ret=acedEntSel(L"\nPick Curve: ",ent,p1);
  67.                 } while (ret == RTNORM);
  68.         }
  69. </div>
复制代码
问题二: VS2010 + AutoCAD 2014中调试一到 AcDbCurve::getClosestPointTo() 函数处 AutoCAD 直接挂掉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-24 16:28 , Processed in 0.274826 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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