乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 102|回复: 9

使用DRX重新创建closestPointTo

[复制链接]

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 04:09:28 | 显示全部楼层 |阅读模式
大家好
我尝试在Bricscad DRX中重新创建closestPointTo(…)ObjectArx AcGeCurve3d方法
从ObjectArx我们有:
AcGePoint3d closestPointTo(const ACGECurve 3D&curve3d,AcGePoint3d&pntOnOtherCrv,const AcGeTol&tol=AcGeContext::gTol)const
曲线3D输入任何三维曲线
pntOnOtherCrv输出输入曲线上与该曲线最近的点
tol迭代法使用的输入公差
查找该曲线与输入曲线之间的两个最近点。此函数的返回值是此曲线上最近的点。输入曲线上最接近的点在pntOnOtherCrv参数中返回
是否有可能使用OdDbLine方法重新创建上述方法
{
public:
  const OdString localName() const { return globalName(); }
  const OdString groupName() const { return DD_T("DRXGLOBAL"); }
  const OdString globalName() const { return OdString("doit"); }
  void execute(OdEdCommandContext* pCmdCtx)
  {
    OdDbCommandContextPtr pDbCmdCtx(pCmdCtx);
    OdDbDatabasePtr pDb = pDbCmdCtx->database();
    OdDbUserIO* pDbIO = pDbCmdCtx->dbUserIO();
    try
    {
      OdDbSelectionSetPtr pFirstSel = pDbIO->select
        (DD_T("\nSelect a Curve: "), OdEd::kSelSingleEntity);
      if(pFirstSel.isNull()) { throw OdError("\nYou missed");}
      OdDbObjectIdArray ids = pFirstSel->objectIdArray();
      if(ids.length() == 0) {throw OdError("\nYou missed");}
      OdDbEntityPtr pEnt = ids[0].safeOpenObject();
      OdDbCurvePtr pline = OdDbCurve::cast(pEnt);
      if(pline.isNull()){throw OdError("\nCannot cast as curve");}
      double endParam;
      double length;
      pline->getEndParam(endParam);
      pline->getDistAtParam(endParam,length);
      int numPoints =  int(length);
      double segLength = length / numPoints;
      OdDbObjectId spaceId = pDb->getModelSpaceId();
      OdDbBlockTableRecordPtr pBtr = spaceId.safeOpenObject(OdDb::kForWrite);
      for(int i = 0; i getPointAtDist(length,seg) == eOk)
        {
          OdDbCirclePtr pCircle = OdDbCircle::createObject();
          pCircle->setCenter(seg);
          pCircle->setRadius(segLength);
          pBtr->appendOdDbEntity(pCircle);
        }
      }
    }
    catch (OdException &ex)
    {
      pDbIO->putString(ex.description());
    }
  }
};
[/code]
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 04:33:36 | 显示全部楼层
嗨Daniel!
这是样条镶嵌的原始ARX代码,其工作方式与您的常数除法算法不同。让此代码在Bricscad DRX上工作对所有DRX用户来说都是宝贵的资源,只要样条是目前最重要的几何曲线类型之一。
问题是我无法在Bricscad中工作,因为closestPointTo()方法没有ObDbLine等价物。
以下是如何使用:
CSplineConvertor Convertor;
AcGePoint3dArray arPoint;
Convertor.SelectSpline(AcDbSpline::cast(pCurve));
Convertor.GetPoints(arPoint);
AcDb3dPolyline*p3dPline=new AcDb3dPolyline(AcDb::k3dSimplePoly, arPoint);
迈克
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 04:46:25 | 显示全部楼层
酷,我会看看代码,我只是用除了样本。
您可能会看到OdGe空间,因为从OdGeCurve3d派生的对象也有一个closestPointTo方法。
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 05:25:49 | 显示全部楼层
嗨,丹尼尔
不幸的是,我不能使用OdGe实体,这就是为什么我只提到OdDb实体的原因。
Mike
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 07:32:28 | 显示全部楼层
为什么?它们尚未实施吗?我知道 Bricscad 一直在为 BRX 开发自己的几何库,所以也许他们正在比 ODA 走得更远。
您是ODA成员吗?
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 07:40:58 | 显示全部楼层
试试看!我没有使用BRX,因为它仅在专业版上可用
迈克
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 08:13:39 | 显示全部楼层
这个问题没有进展?
迈克
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 08:31:50 | 显示全部楼层
嗨,迈克,
使用爆炸怎么样?
  1. //++--
  2. class CommandDoit : public OdStaticRxObject
  3. {
  4. public:
  5.   const OdString localName() const { return globalName(); }
  6.   const OdString groupName() const { return DD_T("DRXGLOBAL"); }
  7.   const OdString globalName() const { return OdString("doit"); }
  8.   void execute(OdEdCommandContext* pCmdCtx)
  9.   {
  10.     OdDbCommandContextPtr pDbCmdCtx(pCmdCtx);
  11.     OdDbDatabasePtr pDb = pDbCmdCtx->database();
  12.     OdDbUserIO* pDbIO = pDbCmdCtx->dbUserIO();
  13.     try
  14.     {
  15.       OdDbSelectionSetPtr pFirstSel = pDbIO->select
  16.         (DD_T("\nSelect a Curve: "), OdEd::kSelSingleEntity);
  17.       if(pFirstSel.isNull()) { throw OdError(L"\nYou missed");}
  18.       OdDbObjectIdArray ids = pFirstSel->objectIdArray();
  19.       if(ids.length() == 0) {throw OdError(L"\nYou missed");}
  20.       OdDbEntityPtr pEnt = ids[0].safeOpenObject();
  21.       OdDbSplinePtr pSpline = OdDbSpline::cast(pEnt);
  22.       if(pSpline.isNull()){throw OdError(L"\nCannot cast as curve");}
  23.       OdRxObjectPtrArray set;
  24.       if( pSpline->explodeGeometry(set) == eOk )
  25.       {
  26.         OdDbObjectId spaceId = pDb->getModelSpaceId();
  27.         OdDbBlockTableRecordPtr pBtr = spaceId.safeOpenObject(OdDb::kForWrite);
  28.         for(size_t i = 0 ; i appendOdDbEntity((OdDbEntity*)set[i].get());
  29.         pSpline->upgradeOpen();
  30.         pSpline->erase();
  31.       }
  32.     }
  33.     catch (OdException &ex)
  34.     {
  35.       pDbIO->putString(ex.description());
  36.     }
  37.   }
  38. };

回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 09:10:26 | 显示全部楼层
这可能是向前迈出的一步!我将分析这个替代方案!
谢谢!
话筒
回复

使用道具 举报

12

主题

63

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
111
发表于 2009-7-30 09:24:08 | 显示全部楼层
这项锻炼对你有什么好处?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-6 00:57 , Processed in 0.177449 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表