C# CAD交互界面-自定义面板集-查找定位(六)

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

一、代码说明

1. 类成员变量声明:

List<ObjectId> objectIds = new List<ObjectId>(); // 用于存储AutoCAD实体对象的ObjectId列表
private static Autodesk.AutoCAD.Windows.PaletteSet _ps2; // 自定义浮动面板集实例
private CustomPaletteControl _customCtrl; // 定制控件实例,包含ListBox及事件处理程序
private static System.Windows.Forms.Panel panel; // 面板容器

// 其他已导入命名空间下的类型(略)

2. CreatePalette() 方法: 这个方法负责创建和配置自定义浮动面板。

  • 创建并初始化一个 PaletteSet 实例,设置其名称和最小尺寸。
  • 创建文本框 textBox 并设置其属性如是否多行、位置、大小等。
  • 创建按钮 button1,设置文本、位置、大小,并为 Click 事件绑定 Button1_Click 处理程序。
  • 初始化或复用 _customCtrl 控件,并将其添加到 Panel 中。
  • 将文本框、按钮和自定义控件添加至 Panel 中。
  • 将 Panel 添加到 PaletteSet 的指定区域,并显示整个 PaletteSet。
// 声明成员变量:存储对象ID的列表
        List<ObjectId> objectIds = new List<ObjectId>();

        // 创建PaletteSet实例
        private static Autodesk.AutoCAD.Windows.PaletteSet _ps2;
        
        // 创建CustomPaletteControl实例(假设这是一个包含ListBox的自定义控件)
        private CustomPaletteControl _customCtrl;

        // 创建Panel容器实例
        private static System.Windows.Forms.Panel panel;

        // 创建并配置自定义浮动面板的方法
        public void CreatePalette()
        {
            // 初始化 PaletteSet,并设置其名称和最小尺寸
            _ps2 = new PaletteSet("我的窗体");
            _ps2.MinimumSize = new System.Drawing.Size(300, 300);

            // 创建并配置文本框控件
            TextBox textBox = new TextBox();
            textBox.Multiline = false;
            textBox.Location = new Point(10, 10);
            textBox.Size = new Size(240, 20);
            textBox.Text = "403";

            // 创建并配置按钮控件
            Button button1 = new Button();
            button1.Text = "查找";
            button1.Location = new Point(10, 40);
            button1.Size = new Size(80, 25);
            
            // 给按钮添加Click事件处理程序
            button1.Click += new EventHandler(Button1_Click);

            // 初始化或复用_customCtrl,并设置位置与大小
            if (_customCtrl == null)
            {
                _customCtrl = new CustomPaletteControl(ListBoxItemSelected);
            }
            _customCtrl.Location = new Point(10, 70);
            _customCtrl.Size = new Size(280, 250);

            // 示例性地向ListBox添加一个项目
            _customCtrl.ListBox1.Items.Add(new CommandItem("00", "00"));

            // 创建Panel并添加控件
            System.Windows.Forms.Panel localPanel = new System.Windows.Forms.Panel(); // 注意这里的panel是局部变量
            localPanel.Controls.Add(textBox);
            localPanel.Controls.Add(button1);
            localPanel.Controls.Add(_customCtrl);

            // 将Panel添加到PaletteSet中
            _ps2.Add("快捷键02", localPanel);

            // 显示PaletteSet
            _ps2.Visible = true;
        }

3. Button1_Click 事件处理程序: 当查找按钮被点击时执行的操作:

  • 获取文本框中的输入内容。
  • 根据输入的内容筛选出预编号层上的文本对象。
  • 遍历所有匹配的对象,并将 ObjectId 加入 objectIds 列表。
  • 如果找到匹配项,则更新 _customCtrl 中 ListBox 的项目,添加与输入文本匹配的实体信息。
// 按钮点击事件处理程序
        private void Button1_Click(object sender, EventArgs e)
        {
            // 获取TextBox中的文本,并进行查找操作...
            // ...省略具体查找逻辑...

            // 如果找到匹配项,则更新_customCtrl中的ListBox内容
            if (_customCtrl != null && objectIds.Count() > 0)
            {
                // 更新视图状态,然后遍历每个ObjectId并将信息添加至ListBox
                // ...省略具体代码实现...
            }
        }

4. ListBoxItemSelected 事件处理程序:

  • 当 ListBox 中的项目被选中时,根据选定项目所关联的 ObjectId 找到对应的实体并高亮显示。

   // ListBoxItemSelected事件处理程序
        private void ListBoxItemSelected(object sender, EventArgs e)
        {
            // 当ListBox项被选中时,获取所选项目的ObjectId并高亮显示相关实体
            // ...省略具体代码实现...
        }

5. ZoomToExtent 方法:

  • 缩放 AutoCAD 视图以适应特定实体的几何范围。
  • 这个方法获取当前文档、数据库、编辑器等信息,启动事务,修改视图属性,然后提交事务并更新屏幕。
// 缩放视图至指定范围的方法
        public static void ZoomToExtent(Extents3d extent)
        {
            // 计算视图中心点及修改视图属性
            // ...省略具体计算和修改视图属性的代码...

            // 更新视图并提交事务
            acDoc.Editor.SetCurrentView(acView);
            acDoc.Editor.UpdateScreen();
            acTrans.Commit();
        }

6. TextBox_KeyDown 事件处理程序: 虽然此事件处理器在给出的代码块中未实际使用,但它的作用是监听文本框内的按键事件。在这里,如果按下的是回车键,则会触发相应的逻辑操作。

// TextBox回车键按下事件处理程序
        private void TextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                // 当用户在TextBox中按回车键时执行的操作
                // ...省略具体实现...
            }
        }

总结来说,这段代码主要实现了以下功能:

  • 在AutoCAD环境中创建一个带有用户交互元素(文本框、按钮)的自定义浮动面板。
  • 根据用户在文本框中输入的预编号搜索相关的图形实体。
  • 显示搜索结果并在用户选择后高亮显示相关实体。
  • 缩放视图以便更好地查看所选实体。

二、完整代码

using Autodesk.AutoCAD.ApplicationServices;//CAD实体
using Autodesk.AutoCAD.DatabaseServices;//数据库服务
using Autodesk.AutoCAD.EditorInput;//命令栏
using Autodesk.AutoCAD.Geometry;//几何图形
using Autodesk.AutoCAD.Windows;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using Application = Autodesk.AutoCAD.ApplicationServices.Application;
using Button = System.Windows.Forms.Button;
using TextBox = System.Windows.Forms.TextBox;

namespace cad自定义面板集.forms
{
    internal class showbox
    {
        List<ObjectId> objectIds = new List<ObjectId>(); // 用实际的数据填充这个列表
        private static Autodesk.AutoCAD.Windows.PaletteSet _ps2;
        //private static CustomPaletteControl _customCtrl;
        private CustomPaletteControl _customCtrl;
        private static System.Windows.Forms.Panel panel;

        public void CreatePalette()
        {

            _ps2 = new PaletteSet("我的窗体");
            _ps2.MinimumSize = new System.Drawing.Size(300, 300);
            // 创建并配置TextBox与Button控件
            TextBox textBox = new TextBox();
            textBox.Multiline = false;
            textBox.Location = new System.Drawing.Point(10, 10);
            textBox.Size = new System.Drawing.Size(240, 20); // 设置文本框大小
            textBox.Text = "403";
            Button button1 = new Button();
            button1.Text = "查找";
            button1.Location = new System.Drawing.Point(10, 40);
            button1.Size = new System.Drawing.Size(80, 25); // 设置按钮大小                                                
            button1.Click += new EventHandler(Button1_Click);// 添加Button的Click事件处理程序
                                                             // 如果尚未初始化_customCtrl,则在这里进行初始化
            if (_customCtrl == null)
            {
                _customCtrl = new CustomPaletteControl(ListBoxItemSelected);
            }
            _customCtrl.Location = new Point(10, 70);
            _customCtrl.Size = new Size(280, 250);
            _customCtrl.ListBox1.Items.Add(new CommandItem("00", "00"));
            // 将控件添加到Panel或其他容器控件
            System.Windows.Forms.Panel panel = new System.Windows.Forms.Panel();
            panel.Controls.Add(textBox);
            panel.Controls.Add(button1);
            panel.Controls.Add(_customCtrl);
            _ps2.Add("快捷键02", panel);
            // 显示面板
            _ps2.Visible = true;
        }
        // 定义Button点击事件处理程序
        private void Button1_Click(object sender, EventArgs e)
        {
            // 获取TextBox中的文本
            TextBox textBox = (sender as Button).Parent.Controls.OfType<TextBox>().FirstOrDefault();
            if (textBox != null)
            {
                string inputText = textBox.Text;
                //System.Windows.Forms.MessageBox.Show($"您输入的内容是:{inputText}");
                Document doc = Application.DocumentManager.MdiActiveDocument;
                Database db = doc.Database;
                Editor ed = doc.Editor;
                string ybh = inputText;
                // ed.WriteMessage(ybh + "\n");
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    // 获取所有预编号文本对象
                    TypedValue[] filter = new TypedValue[]
                    {
            new TypedValue((int)DxfCode.LayerName, "预编号")
                    };

                    SelectionFilter sf = new SelectionFilter(filter);
                    PromptSelectionResult psr = ed.SelectAll(sf);
                    if (psr.Status == PromptStatus.OK)
                    {
                        SelectionSet SS = psr.Value;
                        Entity current_entity = null;
                        objectIds.Clear();
                        foreach (ObjectId id in SS.GetObjectIds())
                        {
                            Entity textEnt = (Entity)tr.GetObject(id, OpenMode.ForRead);

                            if (textEnt is DBText)
                            {
                                DBText dbText = (DBText)textEnt;
                                string te = dbText.TextString;
                                Point3d tkp = dbText.Position;
                                int index = te.IndexOf(ybh);
                                // ed.WriteMessage(index + "-index\n");
                                // ed.WriteMessage(te + "-te\n");
                                // ed.WriteMessage(ybh + "-ybh\n");
                                if (index != -1)
                                {
                                    //ed.WriteMessage("-找到\n");
                                    //current_entity = textEnt;
                                    objectIds.Add(id);
                                }

                            }
                        }
                        if (_customCtrl != null && objectIds.Count() > 0)
                        {
                            _ps2.Visible = false;
                            ed.WriteMessage(objectIds.Count() + "-objectIds.Count()\n");
                            foreach (ObjectId id in objectIds)
                            {
                                Entity textEnt = (Entity)tr.GetObject(id, OpenMode.ForRead);
                                DBText dbText = (DBText)textEnt;
                                string te = dbText.TextString;
                                var item = new formsCommandItem(te, id);
                                _customCtrl.ListBox1.Items.Add(item);
                            }
                            if (!_ps2.Visible)
                            {
                                _ps2.Visible = true;
                            }

                        }
                        if (current_entity != null)
                        {
                            current_entity.Highlight();//高亮显示实体 
                            ZoomToExtent(current_entity.GeometricExtents);
                        }

                    }
                    else
                    {
                        ed.WriteMessage("没找到\n");
                    }
                    tr.Commit();
                }
            }

        }
        private void ListBoxItemSelected(object sender, EventArgs e)
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = HostApplicationServices.WorkingDatabase;
            Editor ed = doc.Editor;
            if (_customCtrl.ListBox1.SelectedItem is formsCommandItem selectedCommandItem && selectedCommandItem.ObjectId != ObjectId.Null)
            {
                using (var tr = db.TransactionManager.StartTransaction())
                {
                    Entity current_entity = tr.GetObject(selectedCommandItem.ObjectId, OpenMode.ForRead) as Entity;
                    // ... 进行与选定 ObjectId 相关的操作 ...
                    current_entity.Highlight();//高亮显示实体 
                    ZoomToExtent(current_entity.GeometricExtents);
                    tr.Commit();
                }
            }

        }
        // <summary>
        /// 缩放至指定范围
        /// </summary>
        /// <param name="extent"></param>
        public static void ZoomToExtent(Extents3d extent)
        {


            Point3d pMin = extent.MinPoint;

            Point3d pMax = extent.MaxPoint;

            //获取当前文档及数据库
            Document acDoc = Application.DocumentManager.MdiActiveDocument;

            Database acCurDb = acDoc.Database;
            Editor ed = acDoc.Editor;

            // 启动事务
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                // 获取当前视图
                using (ViewTableRecord acView = acDoc.Editor.GetCurrentView())
                {
                    ed.WriteMessage($" 设置视图的高01:" + acView.Height + "\n");
                    ed.WriteMessage($" 设置视图的宽01:" + acView.Width + "\n");
                    ed.WriteMessage($" 设置视图中心01:" + acView.CenterPoint + "\n");
                    // 修改视图属性
                    acView.Height = 33.1615367318681;
                    acView.Width = 69.9654061867447;
                    acView.CenterPoint = new Point2d(-201556.0997, -1520456.661);
                    // 修改视图属性
                    // acView.Height = Math.Abs(pMin.Y - pMax.Y);
                    //acView.Width = Math.Abs(pMin.X - pMax.X);
                    acView.CenterPoint = new Point2d((pMin.X - 612277.2549), (pMin.Y - 4556539.37));
                    ed.WriteMessage($" 设置视图的高02:" + acView.Height + "\n");
                    ed.WriteMessage($" 设置视图的宽02:" + acView.Width + "\n");
                    ed.WriteMessage($" 设置视图中心02:" + acView.CenterPoint + "\n");
                    // 更新当前视图
                    acDoc.Editor.SetCurrentView(acView);
                    acDoc.Editor.UpdateScreen();
                    acTrans.Commit();
                }
                // 提交更改

            }
        }



    }
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/384570.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 笔记 006 创建接口_注册

1.1 由于返回数据都是以下这种格式&#xff0c;那么久再编写一个result实体类 报错了&#xff0c;原因是没有构造方法 可以使用lombok的注解自动生成&#xff0c;添加无参的构造器和全参的构造器 package com.geji.pojo;import lombok.AllArgsConstructor; import lombok.NoArg…

《UE5_C++多人TPS完整教程》学习笔记2 ——《P3 多人游戏概念(Multiplayer Concept)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P3 多人游戏概念&#xff08;Multiplayer Concept&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译…

【机器学习】卷积和反向传播

一、说明 自从 AlexNet 在 2012 年赢得 ImageNet 竞赛以来&#xff0c;卷积神经网络 (CNN) 就变得无处不在。从不起眼的 LeNet 到 ResNets 再到 DenseNets&#xff0c;CNN 无处不在。 您是否想知道 CNN 的反向传播中会发生什么&#xff0c;特别是反向传播在 CNN 中的工作原理。…

蓝牙BLE学习-概述

1. 简介 1.1 蓝牙发展历程 蓝牙&#xff0c;直接来自于一位国王的名字--King Harald ‘Bluetooth Gromsson。这位国王因两件事留名于史&#xff0c;其一是在公园958年统一了丹麦和挪威&#xff0c;其二是在其死后&#xff0c;其牙齿呈现出暗蓝色的颜色&#xff0c;因而得名蓝牙…

WordPress修改所有用户名并发送邮件通知的插件Easy Username Updater

前面跟大家介绍了『如何修改WordPress后台管理员用户名&#xff1f;推荐2种简单方法』一文&#xff0c;但是对于有很多用户的站长来说&#xff0c;操作有点复杂&#xff0c;而且无法发邮件通知对方&#xff0c;所以今天boke112百科向大家推荐一款可以直接在WordPress后台修改所…

记录一下,我使用stm32实现pwm波输入,以及对频率和占空比的计算,同时通过串口输出(实现-重要)

1&#xff0c;首先看下半物理仿真 看下我的配置&#xff1a; 看下计算方法以及matlab的仿真输出的数据&#xff1a; timer3的ch2是选择高电平&#xff0c;计算频率 timer3的ch1是选择的是低电平&#xff0c;用来计算周期 其中TemPIpre表示的是CH2输出的值&#xff0c; TemPI…

ElasticSearch级查询Query DSL上

目录 ES高级查询Query DSL match_all 返回源数据_source 返回指定条数size 分页查询from&size 指定字段排序sort 术语级别查询 Term query术语查询 Terms Query多术语查询 exists query ids query range query范围查询 prefix query前缀查询 wildcard query通…

「计算机网络」数据链路层

数据链路层的地位&#xff1a;网络中的主机、路由器等都必须实现数据链路层信道类型 点对点信道&#xff1a;使用一对一的点对点通信方式广播信道 使用一对多的广播通信方式必须使用专用的共享信道协议来协调这些主机的数据发送 使用点对点信道的数据链路层 数据链路和帧 链…

ansible shell模块 可以用来使用shell 命令 支持管道符 shell 模块和 command 模块的区别

这里写目录标题 说明shell模块用法shell 模块和 command 模块的区别 说明 shell模块可以在远程主机上调用shell解释器运行命令&#xff0c;支持shell的各种功能&#xff0c;例如管道等 shell模块用法 ansible slave -m shell -a cat /etc/passwd | grep root # 可以使用管道…

比特币突然大涨

作者&#xff1a;秦晋 2月9日&#xff0c;除夕夜&#xff0c;比特币突然大涨&#xff0c;最高涨至48219美元&#xff0c;涨幅超6%。据CNBC报道&#xff0c;本周比特币已经上涨10.76%&#xff0c;创下自12月8日以来的最佳的一周。本周ETH上涨8.46%&#xff0c;成为自1月12日以来…

蓝桥杯-X图形

问题描述 给定一个字母矩阵。一个 X 图形由中心点和由中心点向四个 45度斜线方向引出的直线段组成&#xff0c;四条线段的长度相同&#xff0c;而且四条线段上的字母和中心点的字母相同。 一个 X 图形可以使用三个整数 r,c,L 来描述&#xff0c;其中 r,c 表示中心点位于第 r 行…

【Java程序设计】【C00261】基于Springboot的休闲娱乐代理售票系统(有论文)

基于Springboot的休闲娱乐代理售票系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的休闲娱乐代理售票系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;休闲娱乐代理…

视频讲解:优化柱状图

你好&#xff0c;我是郭震 AI数据可视化 第三集&#xff1a;美化柱状图&#xff0c;完整视频如下所示&#xff1a; 美化后效果前后对比&#xff0c;前&#xff1a; 后&#xff1a; 附完整案例源码&#xff1a; util.py文件 import platformdef get_os():os_name platform.syst…

探索Redis特殊数据结构:Geospatial(地理位置)在实际中的应用

一、概述 Redis官方提供了多种数据类型&#xff0c;除了常见的String、Hash、List、Set、zSet之外&#xff0c;还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic&#xff08;HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Confi…

【开源】JAVA+Vue.js实现天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

three.js 细一万倍教程 从入门到精通(一)

目录 一、three.js开发环境搭建 1.1、使用parcel搭建开发环境 1.2、使用three.js渲染第一个场景和物体 1.3、轨道控制器查看物体 二、three.js辅助设置 2.1、添加坐标轴辅助器 2.2、设置物体移动 2.3、物体的缩放与旋转 缩放 旋转 2.4、应用requestAnimationFrame …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ImageAnimator组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之ImageAnimator组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、ImageAnimator组件 提供分隔器组件&#xff0c;分隔不同内容块/内容元素…

一、DataX简介

DataX简介 一、什么是DataX二、DataX设计三、支持的数据源四、框架设计五、运行原理六、DataX和Sqoop对比 一、什么是DataX DataX是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库&#xff08;MySQL、Oracle等&#xff09;、HDFS、Hive、OD…

python -m SimpleHTTPServer mac报错

错误内容&#xff1a; Traceback (most recent call last):File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 174, in _run_module_as_main"__main__", fname, loader, pkg_name)File "/System/Libra…

【GameFramework框架内置模块】1、全局配置(Config)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…