C# CAD交互界面-自定义窗体(三)

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

一、引用

二、开发代码进行详细的说明

  1. 初始化与获取AutoCAD核心对象

    • Database db = HostApplicationServices.WorkingDatabase;:这行代码获取当前工作中的AutoCAD数据库对象。在AutoCAD中,所有图形数据和对象都存储在数据库中。

    • Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;:获取当前活动MDI(多文档界面)文档的编辑器对象。编辑器提供了与用户交互的方法,比如输出命令行信息、获取用户选择等。

    • Document doc = Application.DocumentManager.MdiActiveDocument;:获取当前活动的MDI文档对象,它代表了一个打开的DWG文件,通过它可以访问和操作文档内的所有图形元素。

  2. 自定义窗体Form1

    • public Form1() { InitializeComponent(); }:这是自定义WinForms窗体Form1的构造函数,用于初始化窗体上的控件。这个过程由IDE自动生成,调用InitializeComponent()方法加载窗体设计时添加的所有组件。
  3. 注册命令方法"UiStart"

    • [CommandMethod("UiStart")]:这是一个特性标签,将该方法标记为AutoCAD的一个命令方法,当用户在AutoCAD命令行输入"UiStart"时会执行此方法。

    • public void UiStart():该方法内创建了自定义窗体Form1的一个实例,并使用ShowModelessDialog方法将其作为非模态对话框显示在AutoCAD界面上。这样用户可以同时进行其他AutoCAD操作,而不会被自定义窗体阻塞。

  4. 按钮点击事件处理程序

    • private void button1_Click(object sender, EventArgs e):这是自定义窗体上某个按钮(button1)的点击事件处理程序,在用户点击该按钮时触发。

    • 在事件处理程序内部:

      • 首先提示用户"请框选线段!"。
      • 然后调用ed.GetSelection()获取用户的图形选择结果。
      • 检查用户是否成功选择了图形对象,如果选择状态为OK,则进一步处理选择集(SelectionSet)中的每个对象ID。
      • 未完成的部分是遍历选择集并计算所选线段的总长度。对于每个ObjectId,需要从文档中获取实体对象并检查其类型,如果是线段则累加其长度。
三、完整代码
cs 复制代码
// 获取当前工作数据库对象
Database db = HostApplicationServices.WorkingDatabase;

// 获取当前活动文档的编辑器对象
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

// 获取当前活动的文档对象
Document doc = Application.DocumentManager.MdiActiveDocument;

// Form1类的构造函数,初始化窗体控件
public Form1()
{
    public void Initialize()
        {
            UiStart();//启时自动加载工具栏
        }

}

// 注册一个名为"UiStart"的命令方法,在AutoCAD中执行此命令时将打开自定义窗体
[CommandMethod("UiStart")] // CAD启动界面命令
public void UiStart()
{
    // 创建自定义窗体Form1的实例
    Form1 myform = new Form1();

    // 在AutoCAD环境中非模态地显示该窗体
    Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog(myform); // 非模态显示窗体
}

// 自定义窗体上的按钮点击事件处理程序
private void button1_Click(object sender, EventArgs e)
{
    // 在AutoCAD命令行输出提示信息
    ed.WriteMessage("请框选线段!\n");

    // 获取用户在绘图区的选择
    PromptSelectionResult acSSPrompt = ed.GetSelection();
    
    // 检查用户是否成功进行了选择操作
    if (acSSPrompt.Status == PromptStatus.OK)
    {
        // 获取用户所选的对象集合(即选择集)
        SelectionSet sSet = acSSPrompt.Value;

        // 初始化用于累加线段长度的变量
        double sumLen = 0;

        // 如果用户确实选择了对象
        if (sSet != null)
        {
            // 遍历选择集中的每个ObjectId
            foreach (ObjectId id in sSet.GetObjectIds())
            {
                // 在这里需要继续完成获取图形实体、判断其类型为线段并计算长度的逻辑
                // 例如:
                Entity ent = (Entity)doc.GetObject(id, OpenMode.ForRead);
                if (ent is Line)
                {
                    Line line = (Line)ent;
                    sumLen += line.Length;
                }
            }

            // 计算完成后可以在这里输出总长度或其他操作
            ed.WriteMessage($"所有线段总长度为: {sumLen}\n");
        }
    }
}

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

相关推荐
Narutolxy3 分钟前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader10 分钟前
全面解析 Golang Gin 框架
开发语言·golang·gin
禁默21 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Jasmine_llq28 分钟前
《 火星人 》
算法·青少年编程·c#
Code哈哈笑30 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
程序猿进阶34 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
qq_4336184436 分钟前
shell 编程(二)
开发语言·bash·shell
charlie1145141911 小时前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满1 小时前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He9991 小时前
PHP中替换某个包或某个类
开发语言·php