找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 10712|回复: 39

[飞鸟集] ARX的综合运用--反应器,IPM,JIG,acedDragGen,自定义实体及与LISP的通信机制

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-7 00:05:54 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Highflybird 于 2013-10-31 16:51 编辑

此贴起源于:

http://bbs.xdcad.net/thread-667838-1-1.html


这些天做了个程序给LISP调用,其中综合运用了arx的 JIG类,AcEdInputPointMonitor类,反应器,和自定义实体,以及对acedDragGen函数和回调函数做了一些研究。有些部分牵涉到了简单的事务处理。后面我还加了一些定时器,和钩子等。虽然是给LISP的,但其中有许多东西,还是可以利用的。
这个东西花费我一些时间,希望的是能跟大家一起讨论研究,虽然我开源给大家,但是我还是收取了一定数量D豆,那些真心学习研讨的人应该不会在乎这点吧。所以此贴非诚勿扰。如果你相信此贴的价值超过它收取的D豆,就下载吧。
一些有用的建议和bug指出,我会给他们加分。
欢迎大家多提意见。


游客,本帖隐藏的内容需要积分高于 100 才可浏览,您当前积分为 0

版本更新到2013年10月。

评分

参与人数 2D豆 +25 收起 理由
Gdlprfcu + 20 很给力!经验;技术要点;资料分享奖!
ScmTools + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-13 13:39:23 | 显示全部楼层

静下心,多交流,会够的。

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

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

使用道具 举报

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

使用道具 举报

发表于 2013-5-23 11:19:08 来自手机 | 显示全部楼层
给点小小建议:我觉得既然是给lisp调用的,钩子和定时器应该做成文档级的,不应该是全局性的。

点评

现在看来,因为钩子和定时器牵涉到的arx函数都是全局级的,看来无法做到文档级别的了。  详情 回复 发表于 2013-7-26 17:11
很好的建议!多谢。  发表于 2013-5-23 11:53
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2013-7-26 17:11:08 | 显示全部楼层
Gdlprfcu 发表于 2013-5-23 11:19
给点小小建议:我觉得既然是给lisp调用的,钩子和定时器应该做成文档级的,不应该是全局性的。

现在看来,因为钩子和定时器牵涉到的arx函数都是全局级的,看来无法做到文档级别的了。

点评

应该可以吧,我是这样做的,把定时器做成类结构,再在DOC类中定义一个map容器保存当前文档的定时器类,文档被释构时同时释放已实例化的定时器类,这样做还可以同时在同一文档定义多个定时器。具体代码如下: [att  详情 回复 发表于 2013-7-28 01:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 862个

财富等级: 财运亨通

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

使用道具 举报

发表于 2013-7-28 01:30:35 | 显示全部楼层
Highflybird 发表于 2013-7-26 17:11
现在看来,因为钩子和定时器牵涉到的arx函数都是全局级的,看来无法做到文档级别的了。

应该可以吧,我是这样做的,把定时器做成类结构,再在DOC类中定义一个map容器保存当前文档的定时器类,文档被释构时同时释放已实例化的定时器类,这样做还可以同时在同一文档定义多个定时器。具体代码如下:
  1. #include "StdAfx.h"
  2. #include "Timer.h"
  3. class Timer
  4. {
  5. public:
  6.   Timer(HWND CurHandle,UINT nElapse,const ACHAR * CallbackFunction);
  7.   static void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
  8.   static int LispTimer(void);
  9.   static int KillLispTimer(void);
  10. public:
  11.   ~Timer(void);
  12. private:
  13.   ACHAR *m_CallbackFunction;
  14.   UINT m_nElapse;
  15.   static UINT TimerID;
  16.   AcApDocument *m_doc;
  17.   HWND m_CurHandle;
  18.   UINT_PTR uIDEvent;
  19. };
  20. UINT Timer::TimerID = 1000;
  21. Timer::Timer(HWND CurHandle,UINT nElapse,const ACHAR * CallbackFunction):m_CurHandle(CurHandle)
  22. {
  23.   if (nElapse > 0)
  24.   {
  25.     m_nElapse = nElapse;
  26.   }
  27.   else
  28.   {
  29.     m_nElapse = 500;
  30.   }
  31.   TimerID++;
  32.   m_doc = acDocManager->curDocument();
  33.   m_CallbackFunction = new ACHAR[wcslen(CallbackFunction)+ 1];
  34.   wcscpy(m_CallbackFunction,CallbackFunction);
  35.   //m_CurHandle = CurHandle;\\adsw_acadDocWnd();
  36.   uIDEvent = SetTimer(m_CurHandle,TimerID,nElapse,(TIMERPROC)Timer::TimerProc);
  37.   if (uIDEvent == 0)
  38.   {
  39. --TimerID;
  40.   }
  41. }
  42. Timer::~Timer(void)
  43. {
  44.   if (m_CallbackFunction != NULL)
  45.   {
  46.     delete[] m_CallbackFunction;
  47.     m_CallbackFunction = NULL;
  48.   }
  49. }
  50. void Timer::TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
  51. {
  52.   AcApDocument *curdoc = acDocManager->curDocument();
  53.   Timer *curtimer = DocVars.docData().mapTimers[nTimerid];
  54.   if (curtimer->m_doc != curdoc)
  55.   {
  56.     return;
  57.   }
  58.   struct resbuf *in_rb=NULL,*out_rb=NULL;
  59.   in_rb = acutBuildList(RTSTR,curtimer->m_CallbackFunction,RTSHORT,hWnd,RTSHORT,nMsg,RTSHORT,nTimerid,RTSHORT,dwTime,0);
  60.   if (in_rb == NULL)
  61.   {
  62.     return;
  63.   }
  64.   if (acedInvoke(in_rb,&out_rb) != RTNORM )
  65.   {
  66.     return;
  67.   }
  68.   acutRelRb(in_rb);
  69.   in_rb = NULL;
  70.   if (out_rb != NULL)
  71.   {
  72.     acutRelRb(out_rb);
  73.     out_rb = NULL;
  74.   }
  75.   return;
  76. }

  77. int Timer::LispTimer()
  78. {
  79.   struct resbuf *m_rb = acedGetArgs();
  80.   if (m_rb == NULL || m_rb->rbnext == NULL || m_rb->restype != RTSHORT ||(m_rb->rbnext->restype != RTSHORT && m_rb->rbnext->restype != RTSTR))
  81.   {
  82.     return RTERROR;
  83.   }
  84.   HWND CurHandle ;
  85.   if (m_rb->restype == RTSHORT && m_rb->rbnext->restype == RTSHORT)
  86.   {
  87.     if (m_rb->rbnext->rbnext == NULL || m_rb->rbnext->rbnext->restype != RTSTR)
  88.     {
  89.       return RTERROR;
  90.     }
  91.     CurHandle =(HWND) m_rb->resval.rint;
  92.     m_rb = m_rb->rbnext;
  93.   }
  94.   else
  95.   {
  96.      CurHandle = adsw_acadDocWnd();
  97.   }
  98.   Timer *myTime = new Timer(CurHandle,m_rb->resval.rint,m_rb->rbnext->resval.rstring);
  99.   if (myTime->uIDEvent == 0)
  100.   {
  101.     delete myTime;
  102.     myTime = NULL;
  103.     acedRetNil();
  104.   }
  105.   else
  106.   {
  107.     DocVars.docData().mapTimers[myTime->uIDEvent] = myTime;
  108.     acedRetInt(myTime->uIDEvent);
  109.   }
  110.   return RSRSLT;
  111. }
  112. int Timer::KillLispTimer(void)
  113. {
  114.   struct resbuf *m_rb = acedGetArgs();
  115.   if (NULL == m_rb || m_rb->restype != RTSHORT)
  116.   {
  117.     acutPrintf(_T("\n参数类型错误。"));
  118. return RTERROR;
  119.   }
  120.   map<UINT,Timer*>::iterator iter;
  121.   iter = DocVars.docData().mapTimers.find((UINT)m_rb->resval.rint);
  122.   if (iter == DocVars.docData().mapTimers.end())
  123.   {
  124.     acedRetNil();
  125.     return RSRSLT;
  126.   }
  127.   Timer *m_timer = DocVars.docData().mapTimers[m_rb->resval.rint];
  128.   bool isok;
  129.   isok = KillTimer(m_timer->m_CurHandle,m_timer->uIDEvent);
  130.   if (isok)
  131.   {
  132.     DocVars.docData().mapTimers.erase(m_rb->resval.rint);
  133.     delete m_timer;
  134.     m_timer = NULL;
  135.     acedRetT();
  136.   }
  137.   else
  138.   {
  139.     acutPrintf(_T("\n删除定时器时出错。"));
  140. return RTERROR;
  141.   }
  142.   return RSRSLT;
  143. }



点评

嗯,好方法。 但是那个钩子是全局级别的函数,似乎没办法改。  详情 回复 发表于 2013-7-28 09:39

评分

参与人数 2威望 +1 D豆 +15 贡献 +2 收起 理由
Highflybird + 1 + 5 + 1
XDSoft + 10 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2013-7-28 09:39:11 | 显示全部楼层
Gdlprfcu 发表于 2013-7-28 01:30
应该可以吧,我是这样做的,把定时器做成类结构,再在DOC类中定义一个map容器保存当前文档的定时器类,文 ...

嗯,好方法。
但是那个钩子是全局级别的函数,似乎没办法改。

点评

钩子我没试过,不过钩子有一个也够了,只要把回调函数字符串做成文档级的,在ARX里判断一下就可以了,这样就不会在没有加载LISP回调数的文档里出现“xxxx函数没定义"这样的提示了。然后再做一个获取当前回调函数字符  详情 回复 发表于 2013-7-28 11:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-7-28 11:07:52 | 显示全部楼层
Highflybird 发表于 2013-7-28 09:39
嗯,好方法。
但是那个钩子是全局级别的函数,似乎没办法改。

钩子我没试过,不过钩子有一个也够了,只要把回调函数字符串做成文档级的,在ARX里判断一下就可以了,这样就不会在没有加载LISP回调数的文档里出现“xxxx函数没定义"这样的提示了。然后再做一个获取当前回调函数字符串的函数,就像设置系统变量一样,使用完再恢复。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 12:02 , Processed in 0.236128 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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