乐筑天下

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

如何从AcDb2dPolyline对象中获取AcGeCurve3d对象?

[复制链接]

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-6-10 08:22:22 | 显示全部楼层
不。在这种情况下,更好的方法是将AcDb2dPolyline转换为ACDBpline(如我之前所写)。
P.S.:AcDbCircle、AcDbPolyline、AcDbArc等的法线与Z轴不同向如何?同时检查此类图元的标高。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-6-10 08:33:04 | 显示全部楼层
没有。在这种情况下,更好的方法是将AcDb2dPolyline转换为AcDbSpline(正如我以前所写的)。
附:AcDbCircle,AcDbPolyline,AcDbArc等的法线呢?不是与Z轴同向吗?还要检查此类实体的“提升”。

是的,应该考虑这些。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

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

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2010-6-10 10:12:50 | 显示全部楼层

下面是一个工作示例。这里的想法是获取所有这些 if/else/isKindOf 的东西,并将它们放入一个函数中,然后调用适当的重载函数。 这样,原始例程的核心逻辑将保持清晰简洁,同时仍能获得函数重载的好处。
  1. #include "StdAfx.h"
  2. Acad::ErrorStatus Function(const AcDbEntity *& pEnt)
  3. {
  4.     acutPrintf(_T("\nCatch all for AcDbEntity types called. The entity is a %s"), pEnt->isA()->name());
  5.     return Acad::eNotImplementedYet;
  6. }
  7. Acad::ErrorStatus Function(const AcDbLine *& pEnt)
  8. {
  9.     acutPrintf(_T("\nAcDbLine function called."));
  10.     return eOk;
  11. }
  12. Acad::ErrorStatus Function(const AcDbCircle *& pEnt)
  13. {
  14.     acutPrintf(_T("\nAcDbCircle function called."));
  15.     return eOk;
  16. }
  17. /*
  18. * The purpose of the function is to take an entity
  19. * derived from AcDbEntity, determine its type and
  20. * call the correct Function above.
  21. * kind of like a traffic cop, directing traffic.
  22. * Probably not the best function name in the world, but...
  23. */
  24. Acad::ErrorStatus FunctionRouter(const AcDbEntity *& pEnt)
  25. {
  26.     if(pEnt->isKindOf(AcDbLine::desc()))
  27.         return Function((const AcDbLine *&) pEnt);
  28.     else if(pEnt->isKindOf(AcDbCircle::desc()))
  29.         return Function((const AcDbCircle *&) pEnt);
  30.     else if(pEnt->isKindOf(AcDbEntity::desc()))
  31.         return Function((const AcDbEntity *&) pEnt);
  32.     return eWrongObjectType;
  33. }
  34. void TestFunctionRouter(void)
  35. {
  36.     AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();
  37.     AcDbBlockTableRecord * pRec;
  38.     if(acdbOpenAcDbObject((AcDbObject *&) pRec, pDb->currentSpaceId(), AcDb::kForRead) == Acad::eOk) {
  39.         AcDbBlockTableRecordIterator * pIter = NULL;
  40.         if(pRec->newIterator(pIter) == Acad::eOk) {
  41.             for(pIter->start(); !pIter->done(); pIter->step()) {
  42.                 AcDbEntity * pEnt = NULL;
  43.                 if(pIter->getEntity(pEnt, AcDb::kForRead) == Acad::eOk) {
  44.                     Acad::ErrorStatus es;
  45.                     // look ma', no ugly if/else if/else if/else junk in my routine                                       
  46.                     es = FunctionRouter((const AcDbEntity *&)pEnt);
  47.                     pEnt->close();
  48.                 }
  49.             }
  50.             delete pIter;
  51.         }
  52.         pRec->close();
  53.     }       
  54. }
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 20:42 , Processed in 0.196339 second(s), 69 queries .

© 2020-2025 乐筑天下

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