找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1098|回复: 8

[原创]:!!!!!请关注,有关自定义实体中夹点移动时引起的问题

[复制链接]
发表于 2006-5-22 00:41:05 | 显示全部楼层 |阅读模式

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

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

×
本人刚用自定义实体不久 遇到了一系列问题 如有高手路过望不吝赐教.

   首先我想知道 在用鼠标拖动自定义实体的夹点后,CAD触发了那些消息或函数?他们被调用的次序是什么样的? 据我自己观查 好像一旦使用鼠标拖动夹点,CAD首先会调用自定义实体的默认构造函数,然后是DwgOut ,再然后DwgIn ,紧接着 调用夹点移动函数moveGripPointsAt,然后调用WorldDraw,最后调用析构函数,当鼠标不断拖动,这个过程将不断循环. 不知道我的观察是不是对的?

   第二个问题: 我发现 在这个过程中的一对构造和析构函数所对应的对象地址相同(我在函数中打印了this的地址),但是调用DwgOut时this 的地址确与在构造函数与析构函数中的不同,而DwgIn函数中的this地址与构造函数中的this地址相同.    我想问: 在用鼠标移动夹点的过程中,CAD是不是 在做这样一个循环: 先构造一个临时对象,然后用原对象的DwgOut,写出数据, 再由临时实体DwgIn将数据读到临时实体中去,然后用这个临时实体完成moveGripPointsAt和WorldDraw函数,当鼠标左键按下后便不在构造新的临时实体,直接调用原实体的DwgOut,和WorldDraw函数,更新原实体.不知我的理解是否正确???


  第三个问题:  我在我的实体中使用了一个链表,在生产实体的过程中不断将用户在屏幕上指定的点加入链表,但是 我发现在我的实体链表在Dwg文件保存后再读出来的时候 只有一个节点,也就是用户指定的第一点,我跟踪了一下 DwgOut函数的调用,发现 当用户指定第一个点创建实体时,DwgOut立即被调用,然后在指定其他点时不再被调用,当用户指定完所以点后,我发现链表里面确实已经存储了用户的所有点, 然后当我按下工具栏中的保存按钮,Dwg再次被调用,写出了所有数据, 但奇怪的是 当我再打开这幅图的时候,发现这张图里面存储的只有用户指定的第一个节点数据,也就是说可能 读出的是第一次DwgOut 时的那幅图,但是 整个过程中我只生成了一副图啊,难道在我点保存按钮的时候 DwgOut 把数据写到别的地方去了?写出去的跟读进来的不是同一个实体??

  第四: 为什么我的夹点拖动几下以后CAD就没有任何征召的退出了?我在析构函数里面释放链表,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-5-22 11:17:19 | 显示全部楼层
楼主已是高手级人物了,对CAD的分析如此仔细,我也使用自定义实体,但没分析到如此地步。你提的问题太多无从下手,只讲一个问题,你需要CAD告诉你什么时候拖动结束了,或拖动结束的那一刻到底有什么样的消息可以得到。我也研究过,但发现根本做不到,我希望在拖动结束时做一些事情,但这些事情有必须在自定义类的moveGripPointsAt函数中来做。
以下是程序片段:
Acad::ErrorStatus WJRedEntity::moveGripPointsAt(const AcDbIntArray& indices,
                                                const AcGeVector3d& offset)
{
        assertWriteEnabled();
        // TODO: implement this function.



          //拖动结束时的调整
        if(mMoveIsClosed==1 && mMoveOsMode==0)
        {  
          dis=m_StartPoint.distanceTo(mCordOrgPt);
          m_StrLineXdVal=mGeFun->GetDoubData(m_StrLineXdVal);
          ang=acutAngle(asDblArray(mCordOrgPt),asDblArray(m_StartPoint));
          acutPolar(asDblArray(mCordOrgPt),ang,m_StrLineXdVal,asDblArray(m_StartPoint));        
        }
}
其中有一个判断量mMoveIsClosed,这个量是如何来的呢?
我是这样做的,在我的主运行程序中去截获鼠标左键的按下,但鼠标左键按下时主程序去分析当前是否处在拖动状态,如果是的则将该结束标志记录到一个系统变量比如:useri1中,因为在自定义类中可以访问系统变量,在拖动函数中就将useri1的值提供给mMoveIsClosed,这样拖动函数就知道什么时候拖动结束了。至于你其他的问题我想我们以后还是更多的交流机会。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-23 10:31:52 | 显示全部楼层
感谢REDCAD 每次回帖, 其实我关注的问题是我在自定义实体使用了一个链表,但是在拖动夹点时 CAD会突然退出,连异常也不抛,我觉得应该是链表的问题.不知道你平常是怎么处理自定义实体中的链表的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-23 11:08:48 | 显示全部楼层
你的链表是用来存储点的,既然是这样我建议不要采用连接表,这个东西操作不是很简便。
可以采用点数组,可以在自定义类中添加这样的数据用来动态存放你所拾取的点:
AcArray 《AcGePoint3d》 m_UerSelectPt;
对这个数据的访问就非常容易了。
但是这种方式在处理字符串不是很理想,目前还存在问题,不要采用以下数据类型
AcArray 《char*》 m_UerInPutStr;
其中的“《”和“》”都是尖括号,不知什么原因在帖子中显示不出来,所以只好这样。
另外问一下,这个函数你用过没有:acedSSSetFirst
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-28 16:48:49 | 显示全部楼层
你的建议值得采用,谢了!
不好意思,我没用过acedSSSetFirst。
看过你很多贴,你一定是高手!以后多多指教。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-29 08:21:52 | 显示全部楼层
xiongbincsu:
对于你说的第一个问题,我也研究过,而且和你发现的情况是一致的。不过自定义实体我和RedCAD一样使用点数组。
对于第三个问题,我认为可能是DwgIn函数可能有问题,不防贴出来看看。

我还想问,谁知道我的自定义实体撤消时,总是系统崩溃。这是什么原因引起的呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-29 08:49:36 | 显示全部楼层
我的不是在撤消时崩溃,而在卸载Arx程序后,再载入这个Arx程序,在使用定义的命令时崩溃!为什么呀,我想知道!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 18:19 , Processed in 0.463163 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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