明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 130|回复: 2

判断点是否在曲线上

  [复制链接]
发表于 昨天 22:09 | 显示全部楼层 |阅读模式


直线、多段线(1d 2d 3d)、圆弧、圆、椭圆弧、样条曲线


AutoCAD 2013 版本以上直接用
es = acdbConvertAcDbCurveToGelibCurve(pCurve, pGeCurve);
// 或者用 getAcGeCurve
// es = pCurve->getAcGeCurve(pGeCurve);
AcGeCurve3d::isOn

AutoCAD 2013 版本以下需要构造 AcGe 类,然后用
static_cast<AcGeCurve3d*>(pGeLine->copy())

至于曲线转换类高大侠分享过。


  1. Acad::ErrorStatus es;
  2. ads_name name;
  3. AcGePoint3d pt;
  4. if (acedEntSel(_T("\n请选择一条曲线:"), name, asDblArray(pt)) != RTNORM)
  5.     return;

  6. AcDbObjectId objId;
  7. es = acdbGetObjectId(objId, name);
  8. if (es != Acad::eOk) return;
  9. AcDbEntity *pEnt = NULL;
  10. es = acdbOpenObject(pEnt, objId, AcDb::kForRead);
  11. if (es != Acad::eOk) return;

  12. AcGeCurve3d* pGeCurve = NULL;

  13. #if _MSC_VER > 1500
  14. if (pEnt->isKindOf(AcDbCurve::desc()))
  15. {
  16.     AcDbCurve *pCurve = AcDbCurve::cast(pEnt);
  17.     // 转换为几何类
  18.     es = acdbConvertAcDbCurveToGelibCurve(pCurve, pGeCurve);
  19.     // 或者用 getAcGeCurve
  20.     // es = pCurve->getAcGeCurve(pGeCurve);
  21.     pCurve->close();
  22. }
  23. #else   // 低于 AutoCAD 2013 版本
  24. if (pEnt->isKindOf(AcDbLine::desc()))
  25. {
  26.     AcDbLine *pLine = AcDbLine::cast(pEnt);
  27.     AcGeLineSeg3d* pGeLine = CCurveConversion::AcDbCurveToAcGeCurve(pLine);
  28.     pGeCurve = static_cast<AcGeCurve3d*>(pGeLine->copy());
  29.     pLine->close();
  30. }
  31. else if (pEnt->isKindOf(AcDbPolyline::desc()))
  32. {
  33.     AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
  34.     AcGeCompositeCurve3d* pGePoly = CCurveConversion::AcDbCurveToAcGeCurve(pPoly);
  35.     pGeCurve = static_cast<AcGeCurve3d*>(pGePoly->copy());
  36.     pPoly->close();
  37. }
  38. else if (pEnt->isKindOf(AcDb2dPolyline::desc()))
  39. {
  40.     AcDb2dPolyline *pPoly = AcDb2dPolyline::cast(pEnt);
  41.     AcGeCompositeCurve3d* pGePoly = CCurveConversion::AcDbCurveToAcGeCurve(pPoly);
  42.     pGeCurve = static_cast<AcGeCurve3d*>(pGePoly->copy());
  43.     pPoly->close();
  44. }
  45. else if (pEnt->isKindOf(AcDb3dPolyline::desc()))
  46. {
  47.     AcDb3dPolyline *pPoly = AcDb3dPolyline::cast(pEnt);
  48.     AcGeCompositeCurve3d* pGePoly = CCurveConversion::AcDbCurveToAcGeCurve(pPoly);
  49.     pGeCurve = static_cast<AcGeCurve3d*>(pGePoly->copy());
  50.     pPoly->close();
  51. }
  52. else if (pEnt->isKindOf(AcDbArc::desc()))
  53. {
  54.     AcDbArc *pArc = AcDbArc::cast(pEnt);
  55.     AcGeCircArc3d* pGeArc = CCurveConversion::AcDbCurveToAcGeCurve(pArc);
  56.     pGeCurve = static_cast<AcGeCurve3d*>(pGeArc->copy());
  57.     pArc->close();
  58. }
  59. else if (pEnt->isKindOf(AcDbCircle::desc()))
  60. {
  61.     AcDbCircle *pCircle = AcDbCircle::cast(pEnt);
  62.     AcGeCircArc3d* pGeCircle = CCurveConversion::AcDbCurveToAcGeCurve(pCircle);
  63.     pGeCurve = static_cast<AcGeCurve3d*>(pGeCircle->copy());
  64.     pCircle->close();
  65. }
  66. else if (pEnt->isKindOf(AcDbEllipse::desc()))
  67. {
  68.     AcDbEllipse *pEllipse = AcDbEllipse::cast(pEnt);
  69.     AcGeCircArc3d* pGeEllipse = CCurveConversion::AcDbCurveToAcGeCurve(pEllipse);
  70.     pGeCurve = static_cast<AcGeCurve3d*>(pGeEllipse->copy());
  71.     pEllipse->close();
  72. }
  73. else if (pEnt->isKindOf(AcDbSpline::desc()))
  74. {
  75.     AcDbSpline *pSpline = AcDbSpline::cast(pEnt);
  76.     AcGeCircArc3d* pGeSpline = CCurveConversion::AcDbCurveToAcGeCurve(pSpline);
  77.     pGeCurve = static_cast<AcGeCurve3d*>(pGeSpline->copy());
  78.     pSpline->close();
  79. }
  80. #endif
  81. if (pGeCurve)
  82. {
  83.     // 设置捕捉
  84.     resbuf rb;
  85.     rb.rbnext = NULL;
  86.     rb.restype = RTSHORT;
  87.     rb.resval.rint = 555;
  88.     acedSetVar(_T("osmode"), &rb);

  89.     AcGePoint3d ptTest;
  90.     while (acedGetPoint(NULL, _T("\n请拾取点测试是否在曲线上:"), asDblArray(ptTest)) == RTNORM)
  91.     {
  92.         // 拾取点是否位于曲线上
  93.         if (pGeCurve->isOn(ptTest))
  94.             acutPrintf(_T("\n点在曲线上"));
  95.         else
  96.             acutPrintf(_T("\n点不在曲线上"));
  97.     }

  98.     rb.resval.rint = 0;
  99.     acedSetVar(_T("osmode"), &rb);

  100.     delete pGeCurve;
  101. }

  102. pEnt->close();



回复

使用道具 举报

发表于 昨天 22:59 | 显示全部楼层
可能需要增加容差
支持容差判断(考虑浮点精度)
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 23:00 | 显示全部楼层
GE_DLLEXPIMPORT Adesk::Boolean isOn(
    const AcGePoint3d& pnt,
    const AcGeTol& tol = AcGeContext::gTol
) const;

第二个参数
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-9-3 07:36 , Processed in 0.156775 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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