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();}// 提交更改}}}
}
//感谢大家的点赞,收藏,转发,关注
相关文章:
C# CAD交互界面-自定义面板集-查找定位(六)
运行环境 vs2022 c# cad2016 调试成功 一、代码说明 1. 类成员变量声明: List<ObjectId> objectIds new List<ObjectId>(); // 用于存储AutoCAD实体对象的ObjectId列表 private static Autodesk.AutoCAD.Windows.PaletteSet _ps2; // 自定义浮动面板…...
5.7 BCC工具之disksnoop.py解读
一,disksnoop.py简介 disksnoop工具用于追踪块设备的I/O操作的延迟,它会在每次I/O执行完成后打印一行摘要信息。我们根据这些摘要日志,来分析当前的I/O操作是否存在延迟,以判断I/O是否达到了瓶颈。 二,代码示例 #!/usr/bin/python # # disksnoop.py Trace block device…...
QT:实现图片选择器
一、效果图 二、用到的类 qApp:可以快速获取到项目目录位置。 QSettings :编写config文件,记录上次打开图片的位置,下次打开图片会从上次的位置查找图片。 QPixmap:用于图片的缩放,防止图片过小࿰…...
LLM大模型相关问题汇总---包括问题与答案
一、基础篇 1. 目前主流的开源模型体系有哪些? - Transformer体系:由Google提出的Transformer模型及其变体,如BERT、GPT等。 - PyTorch Lightning:一个基于PyTorch的轻量级深度学习框架,用于快速原型设计和实验…...
自动化测试定位不到元素怎么办?
1.动态id定位不到元素 分析原因:每次打开页面,ID都会变化。用ID去找元素,每次刷新页面ID都会发生变化。 解决方案:推荐使用xpath的相对路径方法或者cssSelector查找到该元素。 2.iframe原因定位不到元素 分析原因:…...
1 scala集合-数组
1 定长数组 定长数组,是指数组长度不可变。定义定长数组的方法有如下两种: 方法1: var/val variable_name new Array[元素类型](数组长度) // 通过制定长度定义例如,定义一个长度为20的Int 类型数组。 scala> val a new …...
双场板功率GaN HEMT电容模型以精确模拟开关行为
标题:Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior(TED.16年) 摘要 本文提出了一种基于表面电位的紧凑模型,用于模拟具有栅极和源极场板(FP)结构的AlGaN/G…...
OpenCV Mat实例详解 四
OpenCV Mat实例详解三中详细介绍来了OpenCV Mat类的公有静态成员函数,下面介绍OpenCV Mat类的其他常用成员函数。 OpenCV Mat类常用成员函数 Mat & adjustROI (int dtop, int dbottom, int dleft, int dright); dtop ROI 上边界移动值,如…...
Fluke ADPT 连接器新增对福禄克万用 Fluke 106 的支持
所需设备: 1、Fluke ADPT连接器; 2、Fluke 106; Fluke 106 拆机图: 显示界面如下图: 并且可以将波形导出到EXCEL: 福禄克万用表需要自己动手改造!!!...
算法-3-基本的数据结构
单双链表 1.单链表双链表如何反转 import java.util.ArrayList; import java.util.List;public class Code01_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {public int…...
探秘Java反射:灵活编程的利器
前言 大家好,我是chowley,不知道大家在学习Java的过程中有没有听过反射的概念,今天我来总结一下我心中的Java反射。 在Java编程中,反射是一种强大的工具,它允许程序在运行时检查和操作类、方法、属性等,而…...
记录 | ubuntu pyqt5 pycharm配置
Ubuntu16.04pycharmpyqt5安装与配置_ubuntu pycharm pyqt5-CSDN博客pycharm激活码 6ZUMD7WWWU-eyJsaWNlbnNlSWQiOiI2WlVNRDdXV1dVIiwibGljZW5zZWVOYW1lIjoiSmV0cyBHcm91cCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN…...
ESP32学习(1)——环境搭建
使用的ESP32板子如下图所示 它可以用Arduino 软件,基于C语言开发。但是,在这里,我是用Thonny软件,基于micro_python对其进行开发。 1.安装Thonny Thonny的软件安装包,可以去它官网上下载。Thonny, Python IDE for begi…...
Attention Is All Your Need论文笔记
论文解决了什么问题? 提出了一个新的简单网络架构——transformer,仅仅是基于注意力机制,完全免去递推和卷积,使得神经网络训练地速度极大地提高。 We propose a new simple network architecture, the Transformer, based sole…...
vue-进阶语法(四)
目录 v-model原理 v-model应用于组件 sync修饰符 ref 和 $refs(重点) $nextTick v-model原理 原理:v-model本质上是一个语法糖。例如应用在输入框上,就是 value属性 和 input事件 的合写。 作用:提供数据的双向…...
CGAL::2D Arrangements-7
7 几何Traits 几何Traits封装了几何实体的定义以及处理这些几何实体的几何predicates和构造的实现,供Arrangement_on_surface_2类模板和其他周边模块使用。应用于Arrangement的各种算法所确定的最小要求被组织在精细几何特征概念的层次中。每个概念列出的需求只包括…...
linux系统下vscode portable版本的rust环境搭建004:rust
目的:希望在获得一个新的系统之后,以最简便快速的方式搭配一个rust的编程环境命令在线安装只执行这句就行了 :curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh,因为是要portable安装所以按照以下的方式执行。 下载…...
从汇编角度解释线程间互斥-mutex互斥锁与lock_guard的使用
多线程并发的竞态问题 我们创建三个线程同时进行购票,代码如下 #include<iostream> #include<thread> #include<list> using namespace std; //总票数 int ticketCount100; //售票线程 void sellTicket(int idx) {while(ticketCount>0){cou…...
高程 | 多态性(c++)
文章目录 📚多态📚运算符重载🐇定义🐇规则🐇友元运算符重载函数🐇成员运算符重载函数 📚虚函数📚纯虚函数和抽象类 📚多态 多态:同样的消息被不同类型的对象…...
LV.23 D2 开发环境搭建及平台介绍 学习笔记
一、Keil MDK-ARM简介及安装 Keil MDK,也称MDK-ARM,Realview MDK (Microcontroller Development Kit)等。目前Keil MDK 由三家国内代理商提供技术支持和相关服务。 MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
