找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1807|回复: 11

如何修改自定义实体的形状

[复制链接]
发表于 2005-12-7 14:16:36 | 显示全部楼层 |阅读模式

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

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

×
我自定义的实体,使用worldDraw画出来之后想要通过修改一些参数来改变形状。但我不确定该怎么去做。
简单的办法也许是对画出来的实体调用acdbOpenObject,然后对其erase,标为删除。然后重新拷贝一个实体C++对象修改参数再画出来。但是如果我想不拷贝这个实体的C++对象。能否对其调用两次worldDraw来实现改变形状?或者由什么别的方法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-12-7 14:38:40 | 显示全部楼层
为什么不直接修改那个旧实体的参数?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-8 10:21:31 | 显示全部楼层
你要按正规的方法去做,你的类的WordDraw()函数中所画的图都必须以类的参数通过计算出来,当要修改实体时,只需要修改参数就可以了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-8 11:37:16 | 显示全部楼层
修改参数,然后erase,然后对其使用appendAcDbEntity的时候,系统就崩溃了,出现了访问冲突的错误。
正常情况下使用appendAcDbEntity的时候会运行到worldDraw,然这时候没运行到worldDraw就崩溃了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-8 13:49:29 | 显示全部楼层
不用删除啊,先打开实体,然后修改参数,最后关闭实体,当你关闭实体,系统自动将修改的数据提交到数据库,例如你选择一条直线,先打开这条直线,修改其起点坐标,然后关闭直线,这样视图区的直线起点坐标不是就变化了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-8 17:48:38 | 显示全部楼层
我想我可能没说清楚,不好意思啊,我是在worldDraw里使用polyline之类的函数画出来的线,如下面的一种情况,通过startPt1等点作为参数化出来。但我不知道该如何修改我画出来的东西,我以为是修改startPt1等点之后重新画一下,可是好像不是这样。

在这种情况下,我该如何修改参数?


  1.   [FONT=courier new]
  2. Board::worldDraw(AcGiWorldDraw* pWd)
  3. {
  4.         AcGePoint3d pts1[2],pts2[2];
  5.         pts1[0]=startPt1;
  6.         pts1[1]=endPt1;
  7.         pts2[0]=startPt2;
  8.         pts2[1]=endPt2;
  9.         AcGeVector3d norm(0.0, 0.0, 1.0);
  10.         AcGeVector3d dir(1.0, 0.0, 0.0);
  11.         char buf[10];
  12.         ostringstream ID;
  13.         CString coveredStr="covered";
  14.         CString crossedStr="crossed";
  15.         char buf0[2];
  16.         if(pWd&&drawAble&&!crossed){
  17.                 if(covered==1)
  18.                 {
  19.                         pWd->geometry().text(this->endPt, norm, dir, 25.0, 1.0,0.0, coveredStr);
  20.                         pWd->geometry().polyline(2,pts2);
  21.                 }
  22.                 else if(covered==2)
  23.                 {
  24.                         pWd->geometry().text(this->endPt, norm, dir, 25.0, 1.0,0.0, coveredStr);
  25.                         pWd->geometry().polyline(2,pts1);
  26.                 }
  27.                 else
  28.                 {
  29.                         pWd->geometry().polyline(2,pts1);
  30.                         pWd->geometry().polyline(2,pts2);
  31.                 }
  32.                 if(!isStart)
  33.                         pWd->geometry().circularArc(arcPt[0],arcPt[1],arcPt[2]);
  34.                 else if(forCreateBF)//绘制鼠标落点
  35.                 {
  36.                         ID<<startPt.id;
  37.                         pWd->subEntityTraits().setColor(Colors::kYellow);
  38.                         pWd->geometry().circle(startPt,2,norm);
  39.                         pWd->geometry().text(startPt, norm, dir, 25.0, 1.0,0.0, ID.str().c_str());
  40.                         pWd->subEntityTraits().setColor(Colors::kWhite);
  41.                         ID.str("");

  42.                 }
  43.                 if(closeStart)
  44.                 {
  45.                         pts1[0]=startPt1;
  46.                         pts1[1]=startPt2;
  47.                         pWd->geometry().polyline(2,pts1);
  48.                 }
  49.                 if(closeEnd)
  50.                 {
  51.                         pts1[0]=endPt1;
  52.                         pts1[1]=endPt2;
  53.                         pWd->geometry().polyline(2,pts1);
  54.                 }
  55.                 if(forCreateBF)//绘制点序号
  56.                 {
  57.                         ID<<endPt.id;
  58.                         pWd->subEntityTraits().setColor(Colors::kYellow);
  59.                         pWd->geometry().text(endPt, norm, dir, 25.0, 1.0,0.0, ID.str().c_str());
  60.                         pWd->geometry().circle(endPt,2,norm);
  61.                         pWd->subEntityTraits().setColor(Colors::kWhite);
  62.                         ID.str("");
  63.                 }
  64.         }
  65.         else
  66.         {
  67.                 pWd->geometry().text(this->endPt, norm, dir, 25.0, 1.0,0.0, crossedStr);
  68.         }
  69.         return Adesk::kTrue;
  70. }

  71.   [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-9 12:38:35 | 显示全部楼层
是你说的那样的.你加一个无关的函数就一定可以实现.
如下:
Adesk::UInt16 color=p->colorIndex();
p->setColorIndex((color);

--------------------------------------------
完整流程如下:
定义自定义实体指针
Board * p;自定义实体指针.
...
acdbopenobject(........)
.....
到这里已经得到自定义实体指针.
接着






















p->参数设置修改函数://修改参数
Adesk::UInt16 color=p->colorIndex();
p->setColorIndex((color);

       p->close();
        p->draw();
        actrTransactionManager->flushGraphics();
        acedUpdateDisplay();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-9 13:18:08 | 显示全部楼层
把你头文件贴出来看看,楼上:加一个无关的函数就一定可以实现,其本质是否强制实体更新图象显示?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-9 14:07:54 | 显示全部楼层
??有点看不明白了。。。
我认为,只要加一个修改endPt和StartPt的函数,只要修改了这两个参数,系统会自动重画实体。

Acad::ErrorStatus CBoard::SetEndPt(AcGePoint3d pt)
{
assertWriteEnabled();         // 这句话必须有,它保证系统在修改这个参数值后进行实体重绘
this->endPt = pt;
return Acad::eOk;
}

SetStartPt()也类似;

这样,通过程序或其他方法修改实体参数后,实体自动重新绘制,不需要调用删除或执行acedUpdateDisplay()函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-9 14:26:39 | 显示全部楼层
楼上的方法好使的,原来真的少了这句话
assertWriteEnabled()

多谢多谢哈
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-12-9 17:07:03 | 显示全部楼层
如果是采用向导添加的参数,assertWriteEnabled(); 是会自动生成的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 00:07 , Processed in 0.200751 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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