找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1498|回复: 1

[ARX程序]:请XD看看我错在哪里

[复制链接]
发表于 2002-5-16 09:31:19 | 显示全部楼层 |阅读模式

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

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

×
下面是修改线型宽度的函数,为什么能修改AcDbPolyline线宽,而不能修改AcDb2dPolyline线宽,但奇怪的是查询其组码值确实是变了,但在对象特性对话框中查询时其值却没有变,这是为何??请XD或masterher指点,急!!!

BOOL changePolylineWidth(ads_name en,double linewidth)
{   //根据实体名en,线宽比linewidth,改变polyline,2dpolyline线宽
    double width, swidth, ewidth;
    AcDbEntity* pEnt;
    AcDbObjectId eId,vertexObjId;

    if(acdbGetObjectId(eId, en) != Acad::eOk) return FALSE;
    if(acdbOpenObject(pEnt,eId,AcDb::kForWrite) != Acad::eOk) return FALSE;
    if(!pEnt) { acutPrintf("\n图形数据库打开错误!"); return FALSE; }

    if(pEnt->isKindOf(AcDbPolyline::desc())) {
           ((AcDbPolyline*)pEnt)->getConstantWidth(*&width);
       ((AcDbPolyline*)pEnt)->setConstantWidth(linewidth*width);
       ((AcDbPolyline*)pEnt)->setPlinegen(Adesk::kTrue);
       pEnt->close();  // Finished with the pEnt header.
    }
    else if(pEnt->isKindOf(AcDb2dPolyline::desc())) {
       swidth = ((AcDb2dPolyline*)pEnt)->defaultStartWidth();
           ewidth = ((AcDb2dPolyline*)pEnt)->defaultEndWidth();
       ((AcDb2dPolyline*)pEnt)->setDefaultStartWidth(linewidth*swidth);
           ((AcDb2dPolyline*)pEnt)->setDefaultEndWidth(linewidth*ewidth);
           ((AcDb2dPolyline*)pEnt)->setLinetypeGenerationOn();
       pEnt->close();  // Finished with the pEnt header.
        }
        else { acutPrintf("\n不是Polyline复合线型!"); pEnt->close(); return FALSE; }
    return TRUE;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-5-16 14:58:05 | 显示全部楼层
先见下面两个图:

第一段其实宽度是100,结束宽度150,第二段其实宽度是200,结束宽度是100


                               
登录/注册后可看大图


对于老的AcDb2dPolyline,是复杂实体,是有顶点(AcDb2dVertex)子实体组成,见下面图分析


                               
登录/注册后可看大图


所以,AcDb2dPolyline::setDefaultStartWidth(...)和endWidth(..)是设置缺省的每个子实体顶点的其实和结束宽度。在你new一个AcDb2dPolyline对象实例时候,设置了缺省的宽度后,如果每个顶点都是用这个宽度,那么就不用另外设置子实体的其实和结束宽度了。POST到数据库,子实体的其实和结束宽度使用缺省的设置。

这个是缺省设置的作用(新建2dPolyline时候,可以节省时间,如果子实体宽度都一样的话)。但是他不能更改子实体已经有其实宽度和结束宽度的值(已经存在的2dPolyline对象,你编辑它时候)。

回到你的程序,你现在要编辑一个已经存在的2dPolyline对象,宽度的属性是在每个子实体(顶点)里面定义的其实宽度和结束宽度,除非你重新NEW,否则,如只是编辑的时候,你的缺省设置不影响已经有的宽度,如果你想要修改,必须遍历得到每一个AcDb2dVertex,然后利用AcDb2dVertex::setStartWidth(..)、AcDb2dVertex::setEndWidth(..)来修改宽度,才最终影响到主实体AcDb2dPolyline的宽度属性。

遍历顶点,可以使用下面代码:



  1. [FONT=courier new]
  2.         AcDb2dPolyline *pPoly;
  3.         .................................
  4.         .................................

  5.         for( AcDbObjectIterator* pIter = pPoly->vertexIterator(); !pIter->done(); pIter->step() ) {
  6.             AcDbObjectId id = pIter->objectId();

  7.             AcDb2dVertex*pVertex;
  8.             acdbOpenObject( pVertex, id, AcDb::kForWrite );
  9.             if( pVertex != NULL ) {
  10.                pVertex->setStartWidth(....);
  11.                pVertex->setStartWidth(...);
  12.                 pVertex->close();
  13.             }
  14.         }
  15.         delete pIter;
  16.         pPoly->close();

  17. [/FONT]
复制代码


另外:对于一般的2DPOLYLINE还是推荐你用AcDbPolyline::convertFrom(...)把他们转换成AcDbPolyline实体,然后同一按照AcDbPolyline类的方法进行处理,因为ARX的AcDbCurve类的方法很多AcDb2dPolyline都不适合(因为2DPOLYLINE是老的R13格式的复杂实体,AcDbCurve类很多方法都是对简单的曲线实体有效)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 21:37 , Processed in 0.276900 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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