双击CAD对象,显示自定义对话框实现方法(VB.NET)
<p>我运用扩展数据对CAD中的一条直线赋参数,<br/>想通过双击这条直线 来直接调用一个对话框,将参数显示出来<br/>如何实现呀?谢谢了</p><p>开发语言(VB.NET)</p> 本帖最后由 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>
本帖最后由 作者 于 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;
}
}
}
}
<p>上面是C#的吗?</p><p>我没有用过C#呀,有那位兄弟帮帮忙呀,谢谢 了</p><p></p> 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;
}
}
}
}
<p>大侠,刚才试了一下转换的不行呀</p><p>可否把您的例子打包发给俺呀</p><p>谢谢了</p><p>QQ:75003956</p><p>您的QQ是多少呀,谢谢</p> <p>大侠,还是不行呀,我调用您的dll文件,不行呀</p><p>如果有时间帮俺弄一个VB.NET的了</p><p>谢谢了</p><p></p> <p>?你的Cad版本?VS版本?</p><p>我在Cad2010和VS2008测试的没问题</p><p>机器刚重装完,还没装Cad2008</p> <p>是这样的:对于AutoCAD 2010,Application类中封装了BeginDoubleClick事件,AutoCAD 2009及以下,是没这个事件的。所以,本程序只能在AutoCAD 2010环境下运行。</p><p>如想在低版本AutoCAD中运行,只能靠ARX帮忙了。另,记得COM中也有双击的事件,你可看一下VBA的帮助文件。</p> 哦,这样的话只能在Com的文档双击事件里做了