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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ //练习 5.12 修改统计元音字母的程序,使其能统计以下含有两个字符的字符序列的数量:ff、fl和fi。

C Primer&#xff08;第5版&#xff09; 练习 5.12 练习 5.12 修改统计元音字母的程序&#xff0c;使其能统计以下含有两个字符的字符序列的数量&#xff1a;ff、fl和fi。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /****…

matlab入门,在线编辑,无需安装matab

matlab相关教程做的很完善&#xff0c;除了B站看看教程&#xff0c;官方教程我觉得更加高效。跟着教程一步一步编辑&#xff0c;非常方便。 阅读 MATLAB 官方教程&#xff1a; MATLAB 官方教程提供了从基础到高级的教学内容&#xff0c;内容包括 MATLAB 的基本语法、数据处理…

探索ChatGPT-4:智能会话的未来已来

深入了解ChatGPT-4&#xff1a;前沿AI的强大功能 ChatGPT-4是最先进的语言模型之一&#xff0c;由OpenAI开发&#xff0c;它在自然语言理解和生成方面的能力已经达到了新的高度。如今&#xff0c;ChatGPT-4已经被广泛应用于多个领域&#xff0c;从教育到企业&#xff0c;再到技…

python适配器模式开发实践

1. 什么是适配器设计模式&#xff1f; 适配器&#xff08;Adapter&#xff09;设计模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁&#xff0c;使得它们可以一起工作&#xff0c;而无需修改它们的源代码。 …

最新在线看4K高清电影网站推荐

随着互联网技术的发展&#xff0c;观看高清电影已经不再是难事。这里我为大家分享几个最新的在线看4K高清电影网站&#xff0c;让您在家就能享受到极致观影体验。 通过下面这个即可 1. 【超清影视】 【超清影视】是国内新兴的4K高清电影网站&#xff0c;拥有海量的影片资源&a…

Netty源码系列 之 FastThreadLocal源码

目录 Netty优化方案之 FastThreadLocal 前言 ThreadLocal ThreadLocal是干什么的&#xff1f; 为什么要使用ThreadLocal工具类去操控存取目标数据到Thread线程 &#xff1f; ThreadLocal的使用场景 目标数据存储到Thread线程对象的哪里&#xff1f; 怎么样把一个目标数据…

【Java程序设计】【C00251】基于Springboot的医院信息管理系统(有论文)

基于Springboot的医院信息管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的医院信管系统 本系统分为管理员功能模块、系统功能模块以及医生功能模块。 系统功能模块&#xff1a;医院信管系统&#xff0c;…

如何在C# Windows Forms应用程序中实现控件之间的连接线

帮我实现绘图工具多个控件连接线&#xff0c;请用c#代码实现 实现绘图工具中多个控件之间的连接线功能&#xff0c;可以通过以下几个步骤来进行&#xff1a; 定义连接线的数据模型&#xff1a;首先需要定义一个模型来表示连接线&#xff0c;这个模型应该包含起点和终点的坐标。…

Ubuntu Desktop - Disks

Ubuntu Desktop - Disks 1. Search your computer -> DisksReferences 1. Search your computer -> Disks ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

java对象内部都有哪些东西

普通对象 对象头 markword 占8字节ClassPointer 指针 :-XX userCompressedClassPointrs 为4字节&#xff0c;不开启为 8字节实例数据 引用类型: -XX userCommpressedOops 为4字节&#xff0c;不开启8字节Padding对齐&#xff0c; 8的倍数 数组对象 对象头&#xff1a;markwor…

【MySQL进阶之路】亿级数据量表SQL调优实战

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 一. 两个主要软件的介绍 1.KeiluVision5软件 Keil uVision5是一款集成开发…