ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CAD二次开发 学习笔记(3)

2022-04-29 11:02:43  阅读:229  来源: 互联网

标签:菜单 RibbonButton RibbonPanel void 笔记 Add 二次开发 new CAD


 CAD二次开发 学习笔记(3)

 

 

 

添加右键菜单

        /// <summary>
        /// 添加右键菜单
        /// </summary>
        [CommandMethod("AddContextMenu")]
        public void AddContextMenu()
        {
            ContextMenuExtension contextMenu = new ContextMenuExtension();
            contextMenu.Title = "我的右键菜单";
            MenuItem item1 = new MenuItem("创建直线");
            item1.Click += new EventHandler(item1_Click);
            MenuItem item2 = new MenuItem("创建圆");
            item2.Click += new EventHandler(item2_Click);

            contextMenu.MenuItems.Add(item1);
            contextMenu.MenuItems.Add(item2);
            Application.AddDefaultContextMenuExtension(contextMenu);

        }

        private void item2_Click(object sender, EventArgs e)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            doc.SendStringToExecute("\nCircle",true,false,true);
        }

        private void item1_Click(object sender, EventArgs e)
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            doc.SendStringToExecute("\nLine", true, false, true);
        }

运行结果

添加Ribbon菜单

/// <summary>
        /// 添加菜单命令
        /// </summary>
        [CommandMethod("AddRibbon")]
        public void AddRibbon()
        {
            RibbonControl control = RibbonControl();
            RibbonTab tab = RibbonTab("菜单标签1", "1");
            RibbonTab tab2 = RibbonTab("菜单标签2", "2");
            RibbonTab tab3 = RibbonTab("菜单标签3", "3");
            RibbonPanel panel = RibbonPanel("菜单面板1");
            RibbonPanel panel2 = RibbonPanel("菜单面板2");
            RibbonPanel panel3 = RibbonPanel("菜单面板3");
            RibbonPanel panel4 = RibbonPanel("菜单面板4");
            RibbonButton button = RibbonButton("菜单按钮1", "菜单命令");
            RibbonButton button2 = RibbonButton("菜单按钮2", "菜单命令");
            RibbonButton button3 = RibbonButton("菜单按钮3", "菜单命令");
            RibbonButton button4 = RibbonButton("菜单按钮4", "菜单命令");
            panel.Source.Items.Add(button);
            panel.Source.Items.Add(button2);
            panel.Source.Items.Add(button3);
            panel.Source.Items.Add(button4);

            tab.Panels.Add(panel);
            tab.Panels.Add(panel2);
            tab.Panels.Add(panel3);
            tab.Panels.Add(panel4);

            control.Tabs.Add(tab);
            control.Tabs.Add(tab2);
            control.Tabs.Add(tab3);
        }
        /// <summary>
        /// 获得菜单控制
        /// </summary>
        /// <returns></returns>
        public RibbonControl RibbonControl()
        {
            if (ComponentManager.Ribbon == null)
            {
                ComponentManager.ItemInitialized +=
                    new EventHandler<RibbonItemEventArgs>(ComponentManager_ItemInitialized);
            }
            return ComponentManager.Ribbon;
        }
        /// <summary>
        /// 用于激活菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ComponentManager_ItemInitialized(object sender, RibbonItemEventArgs e)
        {
            if (ComponentManager.Ribbon != null)
            {
                ComponentManager.ItemInitialized -= new EventHandler<RibbonItemEventArgs>(ComponentManager_ItemInitialized);
            }
        }
        /// <summary>
        /// 创建菜单标签
        /// </summary>
        /// <param name="name">标签名称</param>
        /// <param name="id">标签Id</param>
        /// <returns></returns>
        public RibbonTab RibbonTab(string name, string id)
        {
            RibbonTab tab = new RibbonTab()
            {
                Title =  "Title:"+name,
                
                Id = id,
                IsActive = true,
            };
            return tab;
        }
        /// <summary>
        /// 创建菜单面板
        /// </summary>
        /// <param name="title">面板名称</param>
        /// <returns></returns>
        public RibbonPanel RibbonPanel(string title)
        {
            RibbonPanelSource source = new RibbonPanelSource();
            source.Title = title;
            RibbonPanel panel = new RibbonPanel();
            panel.Source = source;
            return panel;

        }
        /// <summary>
        /// 创建按钮
        /// </summary>
        /// <param name="buttonName"></param>
        /// <param name="commandName"></param>
        /// <returns></returns>
        public RibbonButton RibbonButton(string buttonName, string commandName)
        {
            RibbonButton button = new RibbonButton()
            {
                Text = "Text:" + buttonName,
                
                CommandParameter = commandName,
                ShowText = true,
                CommandHandler = new AdCommandHandler(),
            };
            return button;
        }

运行结果

添加自定义窗口面板

        /// <summary>
        /// 自定义面板Palette
        /// </summary>
        [CommandMethod("AddPalette")]
        public void AddPalette()
        {
            CustomController controller = new CustomController();
            PaletteSet ps = new PaletteSet("我的自定义面板")
            {
                Visible = true,
                Style = PaletteSetStyles.ShowAutoHideButton,
                Dock = DockSides.None,
                MinimumSize = new Size(200, 100),
                Size = new Size(400,200),
            };
            ps.Add("自定义控件",controller);
            ps.Visible = true;
        }

运行结果

菜单层级结构

 

 

基础知识:

嵌入 AutoCAD 的窗体有两种:

ModalDialog(模态对话框), Application.ShowModalDialog(form); 

ModelessDialog(非模态对话框) , Application.ShowModelessDialog(form); 

一、模态对话框

ModalDialog(模态对话框)为不可切换焦点的对话框, 模态窗体显示的时候程序的焦点始终保持在模态窗体上;

如果需要切换到 AutoCAD 环境进行交互的时候需要EditorUserInteraction 类来切换焦点到 AutoCAD 的命令行; 

如果将焦点从CAD切换回窗口,首先需要结束EditorUserInteraction ,然后再用Focus()方法将焦点重新回到窗体;

二、非模态对话框
ModelessDialog(非模态对话框)为活动焦点的对话框,程序焦点可以自由的从 AutoCAD 界面到窗体之间切换,主要用于
用户与 AutoCAD 环境的即时交互操作。 

 using (EditorUserInteraction edUsrInt = ed.StartUserInteraction(this))
{
//交互过程
edUsrInt.End(); //交互结束.
this.Focus();

交互测试-通过窗口选择点

        /// <summary>
        /// 通过交互窗口选择点
        /// </summary>
        [CommandMethod("SelectPointDialog")]
        public void SelectPointDialog()
        {
            using (SelectPointForm form=new SelectPointForm())
            {
                //像CAD提示窗口一样,不在任务栏显示
                form.ShowInTaskbar = false;
                //将form窗口作为模态窗口进行显示
                Application.ShowModalDialog(form);
                //将textBox1的文本信息,显示到Editor窗口
                Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(form.textBox1.Text);
            }    
        
        }
        /// <summary>
        /// 将焦点切换至CAD,以便选择点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

            using (EditorUserInteraction interaction = ed.StartUserInteraction(this))
            {
                Point3d point = GetPoint3D("\n选择点");
                textBox1.Text = $"选择点的坐标  X:{point.X},Y:{point.Y},Z:{point.Z}";
                interaction.End();
                this.Focus();
            }

        }
        /// <summary>
        /// 提示用户拾取一个点
        /// </summary>
        /// <param name="promptMessage"></param>
        /// <returns></returns>
        public Point3d GetPoint3D(string promptMessage)
        {

            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            PromptPointResult result = ed.GetPoint(promptMessage);
            if (result.Status == PromptStatus.OK)
            {
                return result.Value;
            }
            else
            {
                return new Point3d();
            }
        }
        /// <summary>
        /// 确认按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        /// <summary>
        /// 取消按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }
    }

运行结果

 

打印输出相关类的关系图

标签:菜单,RibbonButton,RibbonPanel,void,笔记,Add,二次开发,new,CAD
来源: https://www.cnblogs.com/zhangdezhang/p/16202925.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有