当前位置: 首页 > article >正文

C# CAD交互界面-自定义面板集-添加快捷命令(五)

运行环境 vs2022 c# cad2016  调试成功

一、引用

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
using System;
using System.Drawing;
using System.Windows.Forms;

二、代码说明

  • [CommandMethod("CreatePalette")] 标注的方法 CreatePalette() 是一个在AutoCAD中注册的命令方法,当用户在命令行输入 CreatePalette 时,会触发此方法。

    • 初始化一个新的 PaletteSet 对象,命名为 "我的窗体",并设置了其最小尺寸为300x300像素。

    • 创建一个 CustomPaletteControl 实例,并将 ListBox 的选择更改事件绑定到 ListBoxItemSelected 方法。

    • 向 ListBox 中添加两个 CommandItem 对象,每个对象代表一个具有显示名称和实际命令名的AutoCAD命令或脚本别名(这里假设 "tt10" 和 "tt11" 分别代表某个CAD命令或LISP脚本)。

    • 将 CustomPaletteControl 添加至名为 "快捷键01" 的面板标签下。

    • 最后设置面板集可见,使其出现在AutoCAD界面上。

  • ExecuteAutoCADCommand(string commandName) 方法用于执行传入的AutoCAD命令字符串。当调用此方法时,会在当前活动文档中发送执行命令的指令。

  • ListBoxItemSelected(object sender, EventArgs e) 是 ListBox 选择更改事件的代理方法。当用户从 ListBox 中选择一项时,如果所选项目是一个 CommandItem 并且拥有非空的 CommandName,则通过 ExecuteAutoCADCommand 执行对应的命令,并在命令末尾添加换行符 "\n"(这通常是为了在命令历史记录中区分不同的命令输入)。

  • CustomPaletteControl 类继承自 UserControl,表示承载 ListBox 控件的用户界面元素。构造函数接收 ListBox 选择更改事件的处理程序,并初始化 ListBox 控件的位置、大小以及事件处理。

  • CommandItem 类是一个简单的数据传输对象,用来封装命令的显示名称(DisplayName)和实际命令名(CommandName)。当 ListBox 显示项目时,会调用其 ToString() 方法返回 DisplayName 属性作为显示文本。

三、完整代码

//根据自己要求自己添加 格式如下
customCtrl.ListBox1.Items.Add(new CommandItem("CAD宗地内面积", "tt10"));
customCtrl.ListBox1.Items.Add(new CommandItem("导入", "tt11")); // 假设 dd10 是一个自定义 LISP 或其他扩展的别名

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
using System;
using System.Drawing;
using System.Windows.Forms;

namespace cad自定义面板集
{
    public class Class1
    {
        [CommandMethod("CreatePalette")]
        public void CreatePalette()
        {


            // 初始化面板集对象
            PaletteSet ps = new PaletteSet("我的窗体");
            ps.MinimumSize = new System.Drawing.Size(300, 300);

            // 创建用户自定义控件并设置 ListBox
            CustomPaletteControl customCtrl = new CustomPaletteControl(ListBoxItemSelected);
            customCtrl.ListBox1.Items.Add(new CommandItem("CAD宗地内面积", "tt10"));
            customCtrl.ListBox1.Items.Add(new CommandItem("导入", "tt11")); // 假设 dd10 是一个自定义 LISP 或其他扩展的别名

            // 添加控件到面板集中
            ps.Add("快捷键01", customCtrl);
 
            // 可以添加更多控件...

            // 显示面板
            ps.Visible = true;
        }

        private void ExecuteAutoCADCommand(string commandName)
        {
            Document adoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            adoc.SendStringToExecute(commandName, true, false, false);
        }

        // ListBox 选择更改事件代理方法
        private void ListBoxItemSelected(object sender, EventArgs e)
        {
            if (sender is ListBox listBox && listBox.SelectedItem is CommandItem item && !string.IsNullOrEmpty(item.CommandName))
            {

                ExecuteAutoCADCommand(item.CommandName + "\n");
   
            }
        }
    }

    // 定义承载 ListBox 的 UserControl 类
    public class CustomPaletteControl : UserControl
    {
        public ListBox ListBox1 { get; private set; }

        // 添加构造函数接收 ListBox 选择更改事件代理
        public CustomPaletteControl(EventHandler listBoxSelectedIndexChangedHandler)
        {
            ListBox1 = new ListBox();
            ListBox1.Location = new Point(5, 5);
            ListBox1.Size = new Size(280, 250);

            // 添加 ListBox 选择更改事件处理程序
            ListBox1.SelectedIndexChanged += listBoxSelectedIndexChangedHandler;

            this.Controls.Add(ListBox1);
        }
    }

    // 用于存储命令名称的简单类
    public class CommandItem
    {
        public string DisplayName { get; set; }
        public string CommandName { get; set; }

        public CommandItem(string displayName, string commandName)
        {
            DisplayName = displayName;
            CommandName = commandName;
        }

        public override string ToString()
        {
            return DisplayName;
        }
    }
}

//感谢大家的点赞,收藏,转发,关注 


http://www.kler.cn/news/234072.html

相关文章:

  • 机器学习2--逻辑回归(案列)
  • 大数据Flume--入门
  • C 语言学习七:指针
  • 【MySQL题】——基础概念论述(二)
  • 基于YOLOv8算法的照片角度分类项目实践
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Web组件
  • 【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏10(附项目源码)
  • 【力扣 51】N 皇后(回溯+剪枝+深度优先搜索)
  • 算法学习——LeetCode力扣二叉树篇2
  • 2024.1.31力扣每日一题——找出不同元素数目差数组
  • JAVA面试题11
  • 基于PSO粒子群优化的PID控制器参数整定算法matlab仿真
  • 算法练习-四数之和(思路+流程图+代码)
  • 【linux系统体验】-archlinux折腾日记
  • Java 内存区域介绍
  • 如何为Kafka加上账号密码(二)
  • Android---Jetpack Compose学习002
  • BUUCTF-Real-[Tomcat]CVE-2017-12615
  • 命令行随笔
  • 《计算思维导论》笔记:10.4 关系模型-关系运算
  • JRT监听程序
  • 爬虫练习——动态网页的爬取(股票和百度翻译)
  • Jetpack Compose常用工具包推荐
  • WordPress函数wptexturize的介绍及用法示例,字符串替换为HTML实体
  • HTML5+CSS3+移动web——HTML 基础
  • 计算机网络期末复习要点(谢希仁第8版)抱佛脚通用
  • CodeWave学习笔记--博物馆预约管理系统
  • [C#] 如何对列表,字典等进行排序?
  • 4、解构三个重要的Pipeline(SD-Inpainting, ControlNet, AnimateDiff) [代码级手把手解析diffusers库]
  • redis过期淘汰策略、数据过期策略与持久化方式