乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 85|回复: 7

C# 添加右键菜单实例

[复制链接]

9

主题

26

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2013-7-26 16:46:00 | 显示全部楼层 |阅读模式
遇到一个问题,估计以后也会经常遇到,所以想问问各位大虾,这个问题出在哪里。详细代码我会贴到2楼。
整个功能是通过自定义CAD操作命令,完成鼠标右键的菜单添加,同时点击该菜单,将执行画一条直线的动作。
菜单添加成功,执行画一条直线的代码也成功。但是将两者联合起来,就会报 ”eLockViolation”。
拜托大侠
知识点:
加入到应用程序级的右键菜单中
Application.AddDefaultContextMenuExtension
加入到某一种对象的右键菜单中,比如圆、直线等
Application.AddObjectContextMenuExtension
回复

使用道具 举报

9

主题

26

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2013-7-26 16:46:00 | 显示全部楼层

//右键菜单
        [CommandMethod("addcontext")]
        public void AddContextMenu()
        {
                //右键菜单 对象
                ContextMenuExtension m_ContextMenu = new ContextMenuExtension();
                m_ContextMenu.Title = "ContextMenu Sample";
                //右键菜单项及其事件
                MenuItem MenuItem_1 = new MenuItem("Create Line");
                MenuItem_1.Click += new EventHandler(MenuItem_1_Click);
                //菜单项添加到右键菜单
                m_ContextMenu.MenuItems.Add(MenuItem_1);
                //加入到应用程序级的右键菜单中
                Application.AddDefaultContextMenuExtension(m_ContextMenu);
                //加入到某一种对象的右键菜单中
                //Application.AddObjectContextMenuExtension(RXClass.GetClass(System.Type.GetType("Circle")), m_ContextMenu);
        }
        private void MenuItem_1_Click(object sender, System.EventArgs e)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = HostApplicationServices.WorkingDatabase;
            Editor ed = doc.Editor;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                PromptPointOptions pointOpts,otherOpts;
                PromptPointResult pointResult,otherResult;
                Point3d firstPnt = new Point3d();
                Point3d OtherPnt = new Point3d();
                Line tLine;
                pointOpts = new PromptPointOptions("please select a point: ");
                pointResult = ed.GetPoint(pointOpts);
                if (pointResult.Status == PromptStatus.OK)
                    firstPnt = pointResult.Value;
                otherOpts = new PromptPointOptions("\n select other point: ");
                otherResult = ed.GetPoint(otherOpts);
                if (otherResult.Status == PromptStatus.OK)
                    OtherPnt = otherResult.Value;
                try
                {
                    //得到当前数据库块表
                    BlockTable bt = (BlockTable)(trans.GetObject(db.BlockTableId, OpenMode.ForRead));
                    BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                    tLine = new Line(firstPnt, OtherPnt);
                    //往数据库中添加实体
                    btr.AppendEntity(tLine);
                    trans.AddNewlyCreatedDBObject(tLine, true);
                    trans.Commit();
                }
                catch(Autodesk.AutoCAD.Runtime.Exception g)
                {
                    Application.ShowAlertDialog(g.Message);
                    trans.Abort();
                }
            }
        }
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2013-7-26 18:57:00 | 显示全部楼层
DocumentLock dlock = Application.DocumentManager.MdiActiveDocument.LockDocument();
      try
      {
;;把你画直线的代码放在这里,或者说需要访问Database的代码放在这里
      }
      catch (System.Exception ex)
      {
      }
      finally
      {
        dlock.Dispose();
      }
回复

使用道具 举报

5

主题

29

帖子

1

银币

初来乍到

Rank: 1

铜币
49
发表于 2013-7-29 16:54:00 | 显示全部楼层
操作文档时要对文档进行锁定 ,DocumentLock dlock = Application.DocumentManager.MdiActiveDocument.LockDocument();
然后操作完了记得释放dlock.Dispose();
回复

使用道具 举报

9

主题

26

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2013-7-30 10:06:00 | 显示全部楼层

应该是这个了... 感谢,赶紧去试试
回复

使用道具 举报

9

主题

26

帖子

2

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
62
发表于 2013-7-30 10:21:00 | 显示全部楼层

问题解决了... 对数据库的操作都需要这样吗?为什么在不添加右键菜单的情况下,直接执行画直线的方法是可以实现的呢?
非常感谢!!!
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2013-7-30 13:05:00 | 显示全部楼层
菜单的操作或对话框的操作会认为是在AutoCAD的外面,而一般情况下认为是在AutoCAD内部,两者有差异
回复

使用道具 举报

xgr

56

主题

302

帖子

8

银币

中流砥柱

Rank: 25

铜币
526
发表于 2019-1-15 13:15:00 | 显示全部楼层
CAD2012
//加入到某一种对象的右键菜单中
复制代码
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 02:19 , Processed in 0.429298 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表