明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 14480|回复: 22

[命令] 双击CAD对象,显示自定义对话框实现方法(VB.NET)

  [复制链接]
发表于 2009-5-30 12:34:00 | 显示全部楼层 |阅读模式

我运用扩展数据对CAD中的一条直线赋参数,
想通过双击这条直线 来直接调用一个对话框,将参数显示出来
如何实现呀?谢谢了

开发语言(VB.NET)

发表于 2023-10-29 03:17:50 | 显示全部楼层
本帖最后由 sfzyr 于 2023-12-4 02:27 编辑
雪山飞狐_lzh 发表于 2009-5-30 16:05
Com的版本,引用两个类型库

(这个 veto 在vlisp中,如何调用啊?)
Autodesk.AutoCAD.ApplicationServices这个在lisp中无法引入
另外e.veto,如何写。
  1. ;;;=======创建文档管理器反应器*docmReactor*及回调函数==============================
  2. (defun at_docm_reactor (/)
  3.   (if (not *docmReactor*)
  4.     (setq *docmReactor*
  5.            (vlr-docmanager-reactor
  6.              nil
  7.              '((:vlr-documentLockModeChanged . vetoCommand))
  8.            )
  9.     )
  10.   ) ;_定义文档管理器反应器*docmReactor*
  11. )
  12. (defun vetoCommand (reactorObject parameterlist / e)
  13.   (setq e parameterlist)
  14.   (if (wcmatch (strcase (nth 4 e)) "*eattedit*,*EATTEDIT*")
  15.     (progn
  16.       (princ "hello")
  17.       (princ "如何调用 veto()方法屏蔽(阻止)命令运行")
  18.     )
  19.   )
  20. )
  21. <a href="http://bbs.mjtd.com/forum.php?mod=viewthread&tid=188809&highlight=%CB%AB%BB%F7&_dsign=2338ef59" target="_blank">双击CAD对象,显示自定义对话框实现方法,用vlisp怎么调用这个veto()方法? - AutoLISP/Visual LISP 编程技术 - AutoCAD论坛 - 明经CAD社区 - Powered by Discuz! (mjtd.com)</a>


发表于 2009-5-30 13:01:00 | 显示全部楼层
本帖最后由 作者 于 2009-5-30 13:24:43 编辑

用双击事件配合命令事件,VB.Net的代码你转换下吧
  1.     class TlsApplication : IExtensionApplication
  2.     {
  3.         void IExtensionApplication.Initialize()
  4.         {
  5.             TTest.Start();
  6.         }
  7.         void IExtensionApplication.Terminate()
  8.         {
  9.         }
  10.     }
  11.     class TTest
  12.     {
  13.         static bool m_Veto = false;
  14.         public static void Start()
  15.         {
  16.             Application.DocumentManager.DocumentLockModeChanged += new DocumentLockModeChangedEventHandler(vetoCommand);
  17.             Application.BeginDoubleClick += new BeginDoubleClickEventHandler(beginDoubleClick);
  18.         }
  19.         static void beginDoubleClick(object sender, BeginDoubleClickEventArgs e)
  20.         {
  21.             m_Veto = true;
  22.         }
  23.         static void vetoCommand(object sender, DocumentLockModeChangedEventArgs e)
  24.         {
  25.             if (e.GlobalCommandName.ToLower() == "properties")
  26.             {
  27.                 if (m_Veto)
  28.                 {
  29.                     e.Veto();
  30.                     Application.ShowAlertDialog("hello");
  31.                     m_Veto = false;
  32.                 }
  33.             }
  34.         }
  35.     }
复制代码
 楼主| 发表于 2009-5-30 13:44:00 | 显示全部楼层

上面是C#的吗?

我没有用过C#呀,有那位兄弟帮帮忙呀,谢谢 了

发表于 2009-5-30 13:53:00 | 显示全部楼层
C#代码和VB.Net的代码相差不大的,网上有代码转换器可以试下,不过大体应该看的懂
完整的代码:
  1.     class TlsApplication : IExtensionApplication
  2.     {
  3.         void IExtensionApplication.Initialize()
  4.         {
  5.             TTest.Start();
  6.         }
  7.         void IExtensionApplication.Terminate()
  8.         {
  9.         }
  10.     }
  11.     class TTest
  12.     {
  13.         static bool m_Veto = false;
  14.         public static void Start()
  15.         {
  16.             Application.DocumentManager.DocumentLockModeChanged += new DocumentLockModeChangedEventHandler(vetoCommand);
  17.             Application.BeginDoubleClick += new BeginDoubleClickEventHandler(beginDoubleClick);
  18.         }
  19.         static void beginDoubleClick(object sender, BeginDoubleClickEventArgs e)
  20.         {
  21.             Document doc = Application.DocumentManager.MdiActiveDocument;
  22.             Editor ed = doc.Editor;
  23.             PromptSelectionResult res = ed.SelectImplied();
  24.             SelectionSet ss = res.Value;
  25.             if (ss != null)
  26.             {
  27.                 if (ss.Count == 1)
  28.                 {
  29.                     using (Transaction tr = doc.TransactionManager.StartTransaction())
  30.                     {
  31.                         Line line = tr.GetObject(ss[0].ObjectId, OpenMode.ForRead) as Line;
  32.                         if (line != null)
  33.                         {
  34.                             ResultBuffer rb = line.GetXDataForApplication("MyApp");
  35.                             if (rb != null)
  36.                             {
  37.                                 m_Veto = true;
  38.                             }
  39.                         }
  40.                     }
  41.                 }
  42.             }
  43.         }
  44.         static void vetoCommand(object sender, DocumentLockModeChangedEventArgs e)
  45.         {
  46.             if (e.GlobalCommandName.ToLower() == "properties")
  47.             {
  48.                 if (m_Veto)
  49.                 {
  50.                     e.Veto();
  51.                     
  52.                     Application.ShowAlertDialog("hello");
  53.                     m_Veto = false;
  54.                 }
  55.             }
  56.         }
  57.     }

 楼主| 发表于 2009-5-30 14:22:00 | 显示全部楼层

大侠,刚才试了一下转换的不行呀

可否把您的例子打包发给俺呀

谢谢了

QQ:75003956

您的QQ是多少呀,谢谢

发表于 2009-5-30 14:44:00 | 显示全部楼层

本帖子中包含更多资源

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

x
 楼主| 发表于 2009-5-30 15:04:00 | 显示全部楼层

大侠,还是不行呀,我调用您的dll文件,不行呀

如果有时间帮俺弄一个VB.NET的了

谢谢了

发表于 2009-5-30 15:10:00 | 显示全部楼层

?你的Cad版本?VS版本?

我在Cad2010和VS2008测试的没问题

机器刚重装完,还没装Cad2008

发表于 2009-5-30 15:15:00 | 显示全部楼层

是这样的:对于AutoCAD 2010,Application类中封装了BeginDoubleClick事件,AutoCAD 2009及以下,是没这个事件的。所以,本程序只能在AutoCAD 2010环境下运行。

如想在低版本AutoCAD中运行,只能靠ARX帮忙了。另,记得COM中也有双击的事件,你可看一下VBA的帮助文件。

发表于 2009-5-30 15:20:00 | 显示全部楼层
哦,这样的话只能在Com的文档双击事件里做了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 02:40 , Processed in 0.166869 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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