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

news2025/1/22 18:47:48

运行环境 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();
                }
                // 提交更改

            }
        }



    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java之Maven

1. maven Maven是管理和构建java项目的工具 项目依赖资源(jar包)的管理,避免版本冲突统一项目结构项目构建&#xff0c;标准跨平台(Linux,window,MacOS)的自动化项目管理 2.maven依赖仓库 2.maven安装 maven安装视频教程 3. IDEA集成Maven 4. maven的依赖范围 5. maven生命…

寒假作业——2/13

作业1 作业2 cp cp 当前的文件位置 复制到哪个位置 格式 : cp 路径/文件 路径/目录名/重新命名的目录名 mv mv 当前的文件位置 复制到哪个位置 格式 : mv 路径/文件 路径/目录名/重新命名的目录名 也可进行重命名操作 find 查找文件 find 目标路径 -name 文件名 后续…

猫头虎分享已解决Bug ‍ || 修改mongodb3.0副本集用户密码遇到 BeanDefinitionParsingException

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

LeetCode二叉树的垂序遍历

题目描述 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言&#xff0c;其左右子结点分别位于 (row 1, col - 1) 和 (row 1, col 1) 。树的根结点位于 (0, 0) 。 二叉树的 垂序遍历 从最左边的列开始直到…

VueCLI核心知识2:插件、自定义事件

1 插件 功能&#xff1a;增强Vue 1. 定义插件 2. 使用插件 2 自定义事件 一种组件间的通信方式&#xff1a;适用于 子组件 > 父组件 方式1&#xff1a;使用 或者v-on: <template><div id"app"><!-- 1.通过父组件给子组件绑定一个自定义事件实现…

【Java八股面试系列】并发编程-进程与线程

目录 进程 线程 线程和进程的区别 Java线程和操作系统的线程的区别 请简要描述一下进程和线程在Java中的关系&#xff0c;区别及优缺点&#xff1f;​编辑​编辑​编辑 并发和并行的区别 为什么要使用多线程? 线程的生命周期 什么是线程上下文切换? sleep() 方法和…

STM32自学☞定时器定时中断案例

timer_interrupt.c文件 /* 初始化函数编写步骤&#xff1a; 1.打开时钟 2.选择时基单元的时钟源&#xff08;内部时钟源&#xff09; 3.配置时基单元 4.NVIC配置 5.启动定时器 */ #include "stm32f10x.h" #include "stm32f10x_tim.h" #include …

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…

C#,21根火柴棍问题(21 Matchticks Problem)的算法与源代码

一、21根火柴棍问题&#xff08;21 Matchticks Problem&#xff09; 21根火柴棍问题是西方经典游戏之一。 给定21根火柴&#xff0c;2个人A和B&#xff08;比如&#xff1a;分别是计算机和用户&#xff09;。 每个人一次可以挑选 1-- 4 根火柴。 被迫挑最后一根火柴的人输了…

Blender教程(基础)-顶点合并-18

一、常规合并 准备&#xff0c;新建一个圆环8个点、全选顶点采用F填充&#xff0c;采用J链接多个顶点如下图所示图形。 选择其中一个顶点 按字母GG、移动到离另外一个顶点更近。再选中两个顶点&#xff0c;右键弹出合并顶点>到中心 二、重叠合并 回退回去 按字母G…

Google Cloud 2024 年报告重点介绍了关键的网络威胁和防御

Google Cloud 的 2024 年威胁范围报告预测了云安全的主要风险&#xff0c;并提出了加强防御的策略。 该报告由 Google 安全专家撰写&#xff0c;为寻求预测和应对不断变化的网络安全威胁的云客户提供了宝贵的资源。 该报告强调&#xff0c;凭证滥用、加密货币挖矿、勒索软件和…

HarmonyOS 横屏调试与真机横屏运行

我们有些程序 需要横屏才能执行出效果 我们在预览器上 点击如下图指向出 就进入一个横屏调试了 但 我们真机运行 依旧是竖着的 我们如下图 找到 module.json5 在 abilities 下面 第一个对象 最下面 加上 "orientation": "landscape"然后 我们再真机运…

【Python网络编程之Ping命令的实现】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python开发技术 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; Python网络编程之Ping命令的实现 代码见资源&#xff0c;效果图如下一、实验要求二、协议原理2…

【好玩AI】【Prompt】快情人节了,用GPT写个【渣男模拟器】练习一下与女神的对话吧

情人节了&#xff0c;让我们用GPT写个【渣男模拟器】的机器人跟自己对话&#xff0c;来练习一下与女神的对话吧。 通过本文&#xff0c;你能学到&#xff1a; 1. 如何利用智谱清言平台零代码搭建一个自己的机器人Bot 通过本文&#xff0c;你还能学到&#xff1a; 怎么做一个渣男…

【51单片机】矩阵键盘(江科大)

6.1矩阵键盘 矩阵键盘&#xff1a; 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 1.数码管扫描(输出扫描) 原理:显示第1位→显示第2位→显示第3位→ …… ,然后快速循环这个过程,最终实现所…

C++实现二分查找

目录 例1 例2 例3 例4 例5 例6 例1 704. 二分查找 注意&#xff1a; ①left < right,这里的号是最后一次通过下标mid来判断 ②在偶数的时候mid&#xff0c;左右无所谓&#xff0c;因为left和right都有1&#xff1b; 参考代码 class Solution { public:int search…

Mac上新版InfluxDB使用教程

一、简介 官网&#xff1a;influxdb 二、influxdb安装 建议使用Homebrew在 macOS 上安装 InfluxDB v2&#xff1a; brew install influxdb启动influxdb服务&#xff1a;brew services start influxdb 停止influxdb服务&#xff1a;brew services stop influxdb 查看是否启…

(三十五)大数据实战——Superset可视化平台搭建

前言 本节内容是关于Apache Superset可视化平台的搭建&#xff0c;Apache Superset是一个现代的数据探索和可视化平台 。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数据分析引擎&#xff0c;拥有丰富的图表展示形式&#xff0c;并且支持自…

「Linux」软件安装

MySQL5.7在CentOS安装 安装 配置yum仓库 更新密钥&#xff1a;rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022安装MySQL yum库&#xff1a;rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm使用yum安装MySQL&#xff1a;yum -y in…

原神4.0.1单机版【开局满级】纯单机,无限原石材料

版本介绍 版本4.0.1稳定版【过分追新并不稳&#xff0c;合理才完美】 独家原神&#xff0c;游戏内自带剧情任务&#xff0c;完美仿官&#xff0c;一比一完美复制&#xff01; 已经拥有完美剧情、任务、副本、卡池、深渊、全物品、和全部功能和皮肤。 修改注意 如果要进行不…