P.S.:AcDbCircle、AcDbPolyline、AcDbArc等的法线与Z轴不同向如何?同时检查此类图元的标高。 没有。在这种情况下,更好的方法是将AcDb2dPolyline转换为AcDbSpline(正如我以前所写的)。
附:AcDbCircle,AcDbPolyline,AcDbArc等的法线呢?不是与Z轴同向吗?还要检查此类实体的“提升”。
是的,应该考虑这些。 pkohut,我想了想,发现很难重载函数。
因为当我使用转换DbCurveToGeCurve3d(pCurve)时,我不知道pCurve的类型,或者我会说,pCurve是可变的,它可以是样条,可以是圆弧等,它来自acdbOpenAcDbEntity(pCurve, id,AcDb::kForRead);它由“AcDbCurve*pCurve”定义;所以如果我想接近我的目标,我必须使用函数(pDbCurve->isKindOf(AcDbArc::desc()))...),我没有一个好主意。
谢谢您的帮助。
下面是一个工作示例。这里的想法是获取所有这些 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]