明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1127|回复: 4

奇怪了,高手指点一下,谢谢啦

[复制链接]
发表于 2004-12-17 20:42:00 | 显示全部楼层 |阅读模式
  1.   ads_name entName;
  2.   ads_point ptres;
  3.   if( acedEntSel( "\nPlease pick a polyline:", entName, ptres ) != RTNORM )
  4.   {
  5.     acdbFail( "\nFail to select!" );
  6.     return;
  7.   }
  8.   
  9.   AcDb2dPolyline* pPolyline = NULL;
  10.   AcDbObjectId objId;
  11.   
  12.   if( acdbGetObjectId( objId, entName ) != Acad::eOk || !objId.isValid() )
  13.   {
  14.     acdbFail( "\nCan not get object id of selected object!" );
  15.     return;
  16.   }
  17.   // 不是派生类吗?这里为什么不能获取对象的指针
  18.   if( acdbOpenObject( pPolyline, objId,   AcDb::kForRead ) != Acad::eOk
  19.             || pPolyline == NULL
  20.             || !pPolyline->isKindOf( AcDb2dPolyline::desc() )
  21.     )
  22.   {
  23.     acdbFail( "\nCan not open open selected object!" );
  24.     return;
  25.   }
复制代码
发表于 2004-12-17 22:54:00 | 显示全部楼层

回复

我试了,没问题,



确定你选择的是'POLYLINE', 而不是LWPOLYLINE


AcDb2dPolyline是POLYLINE类型;


AcDbPolyline是LWPOLYLINE类型.


注意适时关闭对象


        pPolyline->close();
 楼主| 发表于 2004-12-18 13:13:00 | 显示全部楼层
谢谢版主老大,不过还是不行啊完整的源代码如下:
  1. void IteraterPolyline()
  2. {
  3.   ads_name entName;
  4.   ads_point ptres;
  5.   if( acedEntSel( "\nPlease pick a polyline:", entName, ptres ) != RTNORM )
  6.   {
  7.     acdbFail( "\nFail to select!" );
  8.     return;
  9.   }
  10.   
  11.   AcDb2dPolyline* pPolyline = NULL;
  12.   AcDbObjectId objId;
  13.   
  14.   if( acdbGetObjectId( objId, entName ) != Acad::eOk || !objId.isValid() )
  15.   {
  16.     acdbFail( "\nCan not get object id of selected object!" );
  17.     return;
  18.   }
  19.   // 不是派生类吗?这里为什么不能获取对象的指针
  20.   if( acdbOpenObject( pPolyline, objId,   AcDb::kForRead ) != Acad::eOk
  21.             || pPolyline == NULL
  22.             || !pPolyline->isKindOf( AcDb2dPolyline::desc() )
  23.     )
  24.   {
  25.     acdbFail( "\nCan not open open selected object!" );
  26.     return;
  27.   }  AcDb2dVertex* pVertex = NULL;
  28.   AcGePoint3d location;
  29.   AcDbObjectId vertexId;
  30.   
  31.   AcDbObjectIterator *pVecIterator = pPolyline->vertexIterator();  for( int vertexNum = 0; !pVecIterator->done(); pVecIterator->step(), vertexNum++ )
  32.   {
  33.     vertexId = pVecIterator->objectId();
  34.     acdbOpenObject( pVertex, vertexId, AcDb::kForRead );
  35.     location = pVertex->position();
  36.     acutPrintf( "\nVertex %d:X[%0.3f], Y[%0.3f], Z[%0.3f]", location[X], location[Y], location[Z] );
  37.     pVertex->close();
  38.   }  pPolyline->close();
  39.   delete pVecIterator;
  40. }
复制代码
我用pl命令在CAD里绘制了一些多段线,不过点选后检测内存发现打开对象的时候pPolyline指针被赋为空,如果我采用 AcDbEntity* pEnt来打开对象则能正常打开.当然,后面对于多段线的操作也就谈不上了.还请版主大哥多多指教,谢谢了!
发表于 2004-12-18 13:48:00 | 显示全部楼层

reply

用acedEntSel选择到实体,如果成功entName被赋值;
用acdbGetObjectId取得objId; 但是你没有判断你选择的实体是AcDb2dPolyline,你就直接用
AcDb2dPolyline* pPolyline = NULL;
acdbOpenObject(pPolyline, objId, AcDb::kForRead); * 用pl命令画的线可能是AcDbPolyline("LWPolyline")
或者AcDb2dPolyline("Polyline"); 系统变量PLINETYPE=0时画AcDb2dPolyline,
PLINETYPE=2(or 1)时画AcDbPolyline.
 楼主| 发表于 2004-12-19 00:58:00 | 显示全部楼层
谢谢版主,果然是你说的这个问题。不过新的问题又出现了下面程序打印多段线的顶点,可是能够获取ID和迭代器(从迭代的数量上来看,是没有错误的)却不能够打开顶点对象,晕了,这是怎么回事?代码片断如下:
  1.   // 作了简单多段线到2d多段线的转化  
  2.   if( pPolyline->convertTo( p2dPolyline, FALSE ) != Acad::eOk )
  3.   {
  4.     acutPrintf( "\nCan not convert simple polyline to 2dpolyline!" );
  5.     return;
  6.   }  AcDb2dVertex* pVertex = NULL;
  7.   AcGePoint3d location;
  8.   AcDbObjectId vertexId;
  9.   
  10.   AcDbObjectIterator *pVecIterator = p2dPolyline->vertexIterator();  for( int vertexNum = 0; !pVecIterator->done(); pVecIterator->step(), vertexNum++ )
  11.   {
  12.     vertexId = pVecIterator->objectId();
  13.     // 能够成功的获取顶点的ID,但是打不开顶点对象
  14.     // 我尝试着用其他的顶点类型来打开,可是依然不行
  15.     // 还请高手指点迷津,谢谢阿
  16.     if( acdbOpenObject( pVertex, vertexId, AcDb::kForRead ) != Acad::eOk )
  17.     {
  18.       acutPrintf( "\nCan not open vertex object of selected polyline!" );
  19.       return;
  20.     }    location = pVertex->position();
  21.     acutPrintf( "\nVertex %d:X[%0.3f], Y[%0.3f], Z[%0.3f]", location[X], location[Y], location[Z] );
  22.     pVertex->close();
  23.   }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 10:16 , Processed in 0.154564 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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