iumike 发表于 2009-7-30 04:09:28

使用DRX重新创建closestPointTo

大家好
我尝试在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.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());
    }
}
};

iumike 发表于 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);
迈克

iumike 发表于 2009-7-30 04:46:25

酷,我会看看代码,我只是用除了样本。
您可能会看到OdGe空间,因为从OdGeCurve3d派生的对象也有一个closestPointTo方法。

iumike 发表于 2009-7-30 05:25:49

嗨,丹尼尔
不幸的是,我不能使用OdGe实体,这就是为什么我只提到OdDb实体的原因。
Mike

iumike 发表于 2009-7-30 07:32:28

为什么?它们尚未实施吗?我知道 Bricscad 一直在为 BRX 开发自己的几何库,所以也许他们正在比 ODA 走得更远。
您是ODA成员吗?

iumike 发表于 2009-7-30 07:40:58

试试看!我没有使用BRX,因为它仅在专业版上可用
迈克

iumike 发表于 2009-7-30 08:13:39

这个问题没有进展?
迈克

iumike 发表于 2009-7-30 08:31:50

嗨,迈克,
使用爆炸怎么样?
//++--
class CommandDoit : public OdStaticRxObject
{
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(L"\nYou missed");}
      OdDbObjectIdArray ids = pFirstSel->objectIdArray();
      if(ids.length() == 0) {throw OdError(L"\nYou missed");}
      OdDbEntityPtr pEnt = ids.safeOpenObject();
      OdDbSplinePtr pSpline = OdDbSpline::cast(pEnt);
      if(pSpline.isNull()){throw OdError(L"\nCannot cast as curve");}
      OdRxObjectPtrArray set;
      if( pSpline->explodeGeometry(set) == eOk )
      {
      OdDbObjectId spaceId = pDb->getModelSpaceId();
      OdDbBlockTableRecordPtr pBtr = spaceId.safeOpenObject(OdDb::kForWrite);
      for(size_t i = 0 ; i appendOdDbEntity((OdDbEntity*)set.get());
      pSpline->upgradeOpen();
      pSpline->erase();
      }
    }
    catch (OdException &ex)
    {
      pDbIO->putString(ex.description());
    }
}
};

iumike 发表于 2009-7-30 09:10:26

这可能是向前迈出的一步!我将分析这个替代方案!
谢谢!
话筒

iumike 发表于 2009-7-30 09:24:08

这项锻炼对你有什么好处?
页: [1]
查看完整版本: 使用DRX重新创建closestPointTo