xwjljh 发表于 2009-5-30 12:34:00

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

<p>我运用扩展数据对CAD中的一条直线赋参数,<br/>想通过双击这条直线 来直接调用一个对话框,将参数显示出来<br/>如何实现呀?谢谢了</p><p>开发语言(VB.NET)</p>

sfzyr 发表于 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,如何写。

;;;=======创建文档管理器反应器*docmReactor*及回调函数==============================
(defun at_docm_reactor (/)
(if (not *docmReactor*)
    (setq *docmReactor*
         (vlr-docmanager-reactor
             nil
             '((:vlr-documentLockModeChanged . vetoCommand))
         )
    )
) ;_定义文档管理器反应器*docmReactor*
)
(defun vetoCommand (reactorObject parameterlist / e)
(setq e parameterlist)
(if (wcmatch (strcase (nth 4 e)) "*eattedit*,*EATTEDIT*")
    (progn
      (princ "hello")
      (princ "如何调用 veto()方法屏蔽(阻止)命令运行")
    )
)
)
<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>


雪山飞狐_lzh 发表于 2009-5-30 13:01:00

本帖最后由 作者 于 2009-5-30 13:24:43 编辑

用双击事件配合命令事件,VB.Net的代码你转换下吧    class TlsApplication : IExtensionApplication
    {
      void IExtensionApplication.Initialize()
      {
            TTest.Start();
      }
      void IExtensionApplication.Terminate()
      {
      }
    }
    class TTest
    {
      static bool m_Veto = false;
      public static void Start()
      {
            Application.DocumentManager.DocumentLockModeChanged += new DocumentLockModeChangedEventHandler(vetoCommand);
            Application.BeginDoubleClick += new BeginDoubleClickEventHandler(beginDoubleClick);
      }
      static void beginDoubleClick(object sender, BeginDoubleClickEventArgs e)
      {
            m_Veto = true;
      }
      static void vetoCommand(object sender, DocumentLockModeChangedEventArgs e)
      {
            if (e.GlobalCommandName.ToLower() == "properties")
            {
                if (m_Veto)
                {
                  e.Veto();
                  Application.ShowAlertDialog("hello");
                  m_Veto = false;
                }
            }
      }
    }

xwjljh 发表于 2009-5-30 13:44:00

<p>上面是C#的吗?</p><p>我没有用过C#呀,有那位兄弟帮帮忙呀,谢谢 了</p><p></p>

雪山飞狐_lzh 发表于 2009-5-30 13:53:00

C#代码和VB.Net的代码相差不大的,网上有代码转换器可以试下,不过大体应该看的懂
完整的代码:
    class TlsApplication : IExtensionApplication
    {
      void IExtensionApplication.Initialize()
      {
            TTest.Start();
      }
      void IExtensionApplication.Terminate()
      {
      }
    }
    class TTest
    {
      static bool m_Veto = false;
      public static void Start()
      {
            Application.DocumentManager.DocumentLockModeChanged += new DocumentLockModeChangedEventHandler(vetoCommand);
            Application.BeginDoubleClick += new BeginDoubleClickEventHandler(beginDoubleClick);
      }
      static void beginDoubleClick(object sender, BeginDoubleClickEventArgs e)
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            PromptSelectionResult res = ed.SelectImplied();
            SelectionSet ss = res.Value;
            if (ss != null)
            {
                if (ss.Count == 1)
                {
                  using (Transaction tr = doc.TransactionManager.StartTransaction())
                  {
                        Line line = tr.GetObject(ss.ObjectId, OpenMode.ForRead) as Line;
                        if (line != null)
                        {
                            ResultBuffer rb = line.GetXDataForApplication("MyApp");
                            if (rb != null)
                            {
                              m_Veto = true;
                            }
                        }
                  }
                }
            }
      }
      static void vetoCommand(object sender, DocumentLockModeChangedEventArgs e)
      {
            if (e.GlobalCommandName.ToLower() == "properties")
            {
                if (m_Veto)
                {
                  e.Veto();
                  
                  Application.ShowAlertDialog("hello");
                  m_Veto = false;
                }
            }
      }
    }

xwjljh 发表于 2009-5-30 14:22:00

<p>大侠,刚才试了一下转换的不行呀</p><p>可否把您的例子打包发给俺呀</p><p>谢谢了</p><p>QQ:75003956</p><p>您的QQ是多少呀,谢谢</p>

雪山飞狐_lzh 发表于 2009-5-30 14:44:00

xwjljh 发表于 2009-5-30 15:04:00

<p>大侠,还是不行呀,我调用您的dll文件,不行呀</p><p>如果有时间帮俺弄一个VB.NET的了</p><p>谢谢了</p><p></p>

雪山飞狐_lzh 发表于 2009-5-30 15:10:00

<p>?你的Cad版本?VS版本?</p><p>我在Cad2010和VS2008测试的没问题</p><p>机器刚重装完,还没装Cad2008</p>

ahlzl 发表于 2009-5-30 15:15:00

<p>是这样的:对于AutoCAD 2010,Application类中封装了BeginDoubleClick事件,AutoCAD 2009及以下,是没这个事件的。所以,本程序只能在AutoCAD 2010环境下运行。</p><p>如想在低版本AutoCAD中运行,只能靠ARX帮忙了。另,记得COM中也有双击的事件,你可看一下VBA的帮助文件。</p>

雪山飞狐_lzh 发表于 2009-5-30 15:20:00

哦,这样的话只能在Com的文档双击事件里做了
页: [1] 2 3
查看完整版本: 双击CAD对象,显示自定义对话框实现方法(VB.NET)