找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2271|回复: 16

[ARX程序]:如何实现insert一个块,并动态移动的功能?

[复制链接]
发表于 2002-10-11 13:21:37 | 显示全部楼层 |阅读模式

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

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

×
我能做到将块插入,但只能在静态插入,与insert命令的实时的动态的插入,(即插入时,鼠标移动,要插入的块也一起动,按下左键,块插入,位置固定)请问用什么方法可以实现。是不是要用 AcEdJig。但我看一本书上说 AcEdJig只能用于简单图。不能用于块。哪用什么方法呢?
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-11 13:31:59 | 显示全部楼层

Re: [ARX程序]:如何实现insert一个块,并动态移动的功能?

最初由 liubangjun 发布
[B]我能做到将块插入,但只能在静态插入,与insert命令的实时的动态的插入,(即插入时,鼠标移动,要插入的块也一起动,按下左键,块插入,位置固定)请问用什么方法可以实现。是不是要用 AcEdJig。但我看一本书上说 A... [/B]


对,从AcGeJig类派生你自己的类

AcDbBlockReference类实现了worldDraw(),可以直接拖动。

如果要处理的实体是R12后的实现了worldDraw()方法的类,那么可以直接使用标准的DRAG,如果块里面的实体有R12的实体,比如:LINE,ARC,CIRCLE等,这些实体没有实现worldDraw(),因此,拖动的时候,需要你自己使用AcGi的绘制基本向量的方法去在屏幕上绘制他们。这样就要求你从AcDbEntity派生一个类来处理这样的块(作为一个AcDbEntity去拖动),包括拖动多个实体的选择集。

你可以看看下面的附件,里面演示了R12实体CIRCLE,如何拖动的例子。

在你的派生自AcDbEntrity的类中,实现wordDraw()中,对于R12实体,用上面例子里面的处理,对R12后的实体,直接用这个实体的worldDraw(..)就可以了。

另外,你用关键字“AcGeJig"、”拖动“等,搜索论坛,论坛以前讨论过如何拖动多个实体的方法和代码。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-11 13:40:50 | 显示全部楼层
下面的代码是XDRX_API里面关于拖动选择集部分的虚函数worldDraw(..)的实现,里面拖动BLOCK,考虑了属性等,你参考下


  1. [FONT=courier new]
  2.                 virtual Adesk::Boolean  worldDraw(AcGiWorldDraw * wd)
  3.                 {
  4.                         wd->geometry().pushModelTransform(m_mat);
  5.                         AcDbEntity* pE;
  6.                         for (int i=0;i<m_idArray.length();i++)
  7.                         {
  8.                                 if (acdbOpenObject(pE,m_idArray[i],AcDb::kForRead)==Acad::eOk)
  9.                                 {
  10.                                         // see if the entity is a block reference, if so then check for any attributes so we don't display the
  11.                                         // definitions
  12.                                         AcDbBlockReference *pBlockref = AcDbBlockReference::cast (pE);
  13.                                         // if it is a block reference
  14.                                         if (pBlockref != NULL)
  15.                                         {
  16.                                                 // create an attribute iterator so we can check to see if any attribute asre attached
  17.                                                 AcDbObjectIterator *pAttributeIterator = pBlockref->attributeIterator ();
  18.                                                 // if it allocated ok
  19.                                                 if (pAttributeIterator != NULL)
  20.                                                 {
  21.                                                         AcDbObjectId   ObjId;
  22.                                                         AcDbAttribute *pAttribute = NULL;         
  23.                                                         // now loop through them
  24.                                                         for (int count=0; !pAttributeIterator->done(); pAttributeIterator->step(), ++count)
  25.                                                         {
  26.                                                                 // get the object id of the attribute
  27.                                                                 ObjId = pAttributeIterator->objectId();
  28.                                                                 // open the object so we can draw it
  29.                                                                 if (acdbOpenObject (pAttribute, ObjId, AcDb::kForRead) != Acad::eOk)
  30.                                                                         continue;
  31.                                                                 // now draw it
  32.                                                                 wd->geometry().draw (pAttribute);
  33.                                                                 // now close the attribute
  34.                                                                 pAttribute->close();
  35.                                                         }
  36.                                                         // delete the iterator
  37.                                                         delete pAttributeIterator;                                               
  38.                                                        
  39.                                                         // see if we have any attributes attached to this block
  40.                                                         // if we have then to stop the attribute definitions being drawn
  41.                                                         if (count)
  42.                                                         {
  43.                                                                 AcDbVoidPtrArray entitySet;
  44.                                                                 // explode and get some temporary entities
  45.                                                                 Acad::ErrorStatus es = pBlockref->explode (entitySet);
  46.                                                                 // if it worked ok
  47.                                                                 if (es == Acad::eOk)
  48.                                                                 {
  49.                                                                         // loop round getting the intersection points
  50.                                                                         for (long i=0l; i<entitySet.length (); ++i)
  51.                                                                         {
  52.                                                                                 // get a pointer to the entity object
  53.                                                                                 AcDbEntity *pNewEnt = (AcDbEntity *)entitySet.at (i);
  54.                                                                                
  55.                                                                                 AcDbAttributeDefinition *pAttributeDef = AcDbAttributeDefinition::cast (pNewEnt);
  56.                                                                                 // if it is NOT an attribute definition
  57.                                                                                 if (pAttributeDef == NULL)
  58.                                                                                 {
  59.                                                                                         // then draw it
  60.                                                                                         wd->geometry().draw (pNewEnt);
  61.                                                                                 }
  62.                                                                                
  63.                                                                                 // delete the temporary entity
  64.                                                                                 delete pNewEnt;
  65.                                                                         }
  66.                                                                 }
  67.                                                         }
  68.                                                         // no attributes - just draw
  69.                                                         else
  70.                                                         {
  71.                                                                 wd->geometry().draw(pE);
  72.                                                         }
  73.                                                 }
  74.                                                 // failed attribute iterator - just draw it
  75.                                                 else
  76.                                                 {
  77.                                                         wd->geometry().draw(pE);
  78.                                                 }
  79.                                         }
  80.                                         // not a block reference - just draw then
  81.                                         else
  82.                                         {
  83.                                                 wd->geometry().draw(pE);
  84.                                         }
  85.                                         pE->close();
  86.                                 }
  87.                         }
  88.                        
  89.                         wd->geometry().popModelTransform();
  90.                         return Adesk::kTrue;
  91.                 }
  92. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-11 23:00:31 | 显示全部楼层
最初由 liubangjun 发布
[B]谢谢xd !
这个站点真是个好地方呵! [/B]



欢迎常来!

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

使用道具 举报

发表于 2004-1-11 11:44:38 | 显示全部楼层
AcDbBlockReference如何拖动啊????我继承了jig,但是只能在命令行中使用,arx通过acedCommand调用就死掉啊?!!!!
有什么特别注意的问题啊〉
我的总是到update的时候cad崩溃:((((
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-1-24 21:15:40 | 显示全部楼层
呵呵,典型的多个实体的jig问题,建议楼主自己做一个类,会很有用的。
奇怪的是,为什么arx本身不提供这种功能,autodesk失败失败太失败。。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3532个

财富等级: 富可敌国

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

使用道具 举报

发表于 2005-1-20 09:32:47 | 显示全部楼层
还是有点不很明白...不过感觉不那么难做了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2005-2-27 10:55:49 | 显示全部楼层
我也是从AcEdJig派生出了类,实现了拖动了,但是不知道如何像CAD用insert命令那样的效果!
还请晓东指点一下,如何实现insert命令的拖动效果!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 11:58 , Processed in 0.221277 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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