pkohut 发表于 2010-6-10 08:22:22

不。在这种情况下,更好的方法是将AcDb2dPolyline转换为ACDBpline(如我之前所写)。
P.S.:AcDbCircle、AcDbPolyline、AcDbArc等的法线与Z轴不同向如何?同时检查此类图元的标高。

highflyingbird 发表于 2010-6-10 08:33:04

没有。在这种情况下,更好的方法是将AcDb2dPolyline转换为AcDbSpline(正如我以前所写的)。
附:AcDbCircle,AcDbPolyline,AcDbArc等的法线呢?不是与Z轴同向吗?还要检查此类实体的“提升”。

是的,应该考虑这些。

highflyingbird 发表于 2010-6-10 08:41:17

pkohut,我想了想,发现很难重载函数。
因为当我使用转换DbCurveToGeCurve3d(pCurve)时,我不知道pCurve的类型,或者我会说,pCurve是可变的,它可以是样条,可以是圆弧等,它来自acdbOpenAcDbEntity(pCurve, id,AcDb::kForRead);它由“AcDbCurve*pCurve”定义;所以如果我想接近我的目标,我必须使用函数(pDbCurve->isKindOf(AcDbArc::desc()))...),我没有一个好主意。
谢谢您的帮助。

pkohut 发表于 2010-6-10 10:12:50


下面是一个工作示例。这里的想法是获取所有这些 if/else/isKindOf 的东西,并将它们放入一个函数中,然后调用适当的重载函数。 这样,原始例程的核心逻辑将保持清晰简洁,同时仍能获得函数重载的好处。
#include "StdAfx.h"
Acad::ErrorStatus Function(const AcDbEntity *& pEnt)
{
    acutPrintf(_T("\nCatch all for AcDbEntity types called. The entity is a %s"), pEnt->isA()->name());
    return Acad::eNotImplementedYet;
}
Acad::ErrorStatus Function(const AcDbLine *& pEnt)
{
    acutPrintf(_T("\nAcDbLine function called."));
    return eOk;
}
Acad::ErrorStatus Function(const AcDbCircle *& pEnt)
{
    acutPrintf(_T("\nAcDbCircle function called."));
    return eOk;
}
/*
* The purpose of the function is to take an entity
* derived from AcDbEntity, determine its type and
* call the correct Function above.
* kind of like a traffic cop, directing traffic.
* Probably not the best function name in the world, but...
*/
Acad::ErrorStatus FunctionRouter(const AcDbEntity *& pEnt)
{
    if(pEnt->isKindOf(AcDbLine::desc()))
      return Function((const AcDbLine *&) pEnt);
    else if(pEnt->isKindOf(AcDbCircle::desc()))
      return Function((const AcDbCircle *&) pEnt);
    else if(pEnt->isKindOf(AcDbEntity::desc()))
      return Function((const AcDbEntity *&) pEnt);
    return eWrongObjectType;
}
void TestFunctionRouter(void)
{
    AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();
    AcDbBlockTableRecord * pRec;
    if(acdbOpenAcDbObject((AcDbObject *&) pRec, pDb->currentSpaceId(), AcDb::kForRead) == Acad::eOk) {
      AcDbBlockTableRecordIterator * pIter = NULL;
      if(pRec->newIterator(pIter) == Acad::eOk) {
            for(pIter->start(); !pIter->done(); pIter->step()) {
                AcDbEntity * pEnt = NULL;
                if(pIter->getEntity(pEnt, AcDb::kForRead) == Acad::eOk) {
                  Acad::ErrorStatus es;
                  // look ma', no ugly if/else if/else if/else junk in my routine                                       
                  es = FunctionRouter((const AcDbEntity *&)pEnt);
                  pEnt->close();
                }
            }
            delete pIter;
      }
      pRec->close();
    }       
}
页: 1 [2]
查看完整版本: 如何从AcDb2dPolyline对象中获取AcGeCurve3d对象?