找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1587|回复: 3

[求助]:AcdbHatch填充3dPolyline的问题

[复制链接]
发表于 2007-4-24 15:47:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在使用AcdbHatch对一个3dPolyline(一个3dPolyline的正方形,正方形的坐标点的z值不同但是却同一个平面上)进行填充的时候,与使用BHatch命令填充出来的效果不同。使用BHatch命令填充出来的hatch与3dPolyline完全重合,而使用AcdbHatch填充出来的hatch与3dPolyline的就不重合。不过我试了很多方法都不行。由于BHatch命令太慢还不能用它来进行填充。请问那位高人有方法解决这个问题谢谢。

下面是使用AcdbHatch填充的代码:
  1. [FONT=courier new]
  2. int MakeHatch
  3. (
  4.                 ads_name entRectangle,                                ads_point ptView
  5. )
  6. {
  7.     AcDbObjectIdArray dbObjIds;
  8.         AcDbObjectId lineId;
  9.         AcDbObjectId pHatchId;
  10.         AcDbBlockTable *pBlockTable = NULL;
  11.         AcDbBlockTableRecord *pBlockTableRecord = NULL;
  12.         AcDbHatch* pHatch = NULL;
  13.         struct resbuf viewrb;
  14.         try{
  15.                 ads_command(RTSTR, L"ucs",RTSTR,L"w",0);
  16.                 acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
  17.                 pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
  18.                 pBlockTable->close();

  19.                 ads_point result;
  20.                 pHatch = new AcDbHatch();
  21.                 AcDb3dPolyline *p3dline;
  22.                 acdbGetObjectId(lineId, entRectangle);

  23.                 acdbOpenObject(p3dline, lineId, AcDb::kForRead);
  24.                 AcDbObjectIterator* vertexIter = p3dline->vertexIterator();
  25.                 p3dline->close();
  26.                 if (vertexIter == NULL)
  27.                         return FALSE;

  28.                 AcGePoint3dArray pointArray;
  29.                 AcDb3dPolylineVertex* vertex;
  30.                 for (; !vertexIter->done(); vertexIter->step()) {
  31.                         if (acdbOpenObject(vertex, vertexIter->objectId(), AcDb::kForRead) == Acad::eOk) {
  32.                                 if (vertex->vertexType() != AcDb::k3dControlVertex)
  33.                                         pointArray.append(vertex->position());
  34.                                 vertex->close();
  35.                         }
  36.                 }
  37.                 delete vertexIter;
  38.                 ads_point p1,p2,p4;

  39.                 p1[0] = pointArray[0].x;
  40.                 p1[1] = pointArray[0].y;
  41.                 p1[2] = pointArray[0].z;

  42.                 p2[0] = pointArray[1].x;
  43.                 p2[1] = 0;
  44.                 p2[2] = 0;

  45.                 p4[0] = pointArray[3].x;
  46.                 p4[1] = 0;
  47.                 p4[2] = 0;

  48.                 ads_command(RTSTR, L"ucs",RTSTR, L"n", RTSTR, L"3",RT3DPOINT, p1, RT3DPOINT, p2, RT3DPOINT, p4, 0);
  49.                 AcGeVector3d normal(0.0, 0.0, 1.0);
  50.                 resbuf to,from;
  51.                 from.restype=RTSHORT;
  52.                 from.resval.rint=1;
  53.                 to.restype=RTSHORT;
  54.                 to.resval.rint=0;
  55.                 acedTrans(&(normal.x),&from,&to,Adesk::kTrue,&(normal.x));

  56.                 pHatch->setNormal(normal);
  57.                 pHatch->setElevation(0.0);
  58.                 pHatch->setPattern(AcDbHatch::kPreDefined, L"SOLID");
  59.                 pHatch->setAssociative(Adesk::kTrue);
  60.                 acdbGetObjectId(lineId, entRectangle);
  61.                 dbObjIds.append(lineId);
  62.                 pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds);
  63.                 pBlockTableRecord->appendAcDbEntity(pHatchId, pHatch);
  64.                 pHatch->evaluateHatch();
  65.                 pHatch->close();
  66.                 pBlockTableRecord->close();

  67.                 return 1;
  68.         }
  69.         catch(...) {
  70.                 if(pBlockTable != NULL) {
  71.                         pBlockTable->close();
  72.                 }
  73.                 if(pBlockTableRecord != NULL) {
  74.                         pBlockTableRecord->close();
  75.                 }
  76.                 if(pHatch != NULL) {
  77.                         pHatch->close();
  78.                 }
  79.                 return 0;
  80.         }
  81. }
  82. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-4-26 21:13:19 | 显示全部楼层
例子,可以的,不知道你写一大堆乱七八糟的代码干嘛,不要try,很危险
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2491个

财富等级: 金玉满堂

发表于 2016-11-2 16:21:46 | 显示全部楼层
学习,帮大忙了,感谢!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-11-2 16:42:53 | 显示全部楼层
先把 3DPOLYLINE 投影到当前观察方向的平面,然后填充试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-26 02:05 , Processed in 0.462815 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表