winform 获取焦点_AutoCAD .NET 二次开发实例(13) 获取块参照坐标并输出到Excel
点击蓝字关注我
0 引言
需求分析:
当需要在固定位置插入块或者是批量替换块时,可以通过获取块的坐标值,然后根据坐标位置进行插入块或者替换。
关键的第一步:就是获取块参照的坐标值。
结果:
1. 代码分析
逻辑:
1. 设置选择集过滤,根据块名称选择块。
2. 块参照(BlockReference)类自带的Position()方法输出坐标
3. 通过NPOI方式输出到Excel
这里做了一个Button按钮来进行交互操作
这里再啰嗦一下这个按钮添加的过程
找到工具性添加Button控件
属性里面更改一下文本属性
然后双击控件 下面添加代码即可!(操碎了心)
设置选择集过滤,可以根据自己需求增加过滤条件,前面都说过怎么弄
获取块参照坐标,用到的就是下面这个方法
遍历所有的块参照,依次获取即可
接下来就是输出的过程了,还是跟之前一样,使用NOPI的方式进行Excel读写,Excel几种读写方式见:https://www.cnblogs.com/kenjiang/p/10790652.html
为什么用这个,之前也说过了,因为不需要Office环境,还快,有一点不好就是新建项目都要去下载NOPI相应的依赖包,挺麻烦的。
写入的代码就不详细说了,毕竟出现第二次了。
完整代码:
//存储读取坐标 List<string> lstAddStr = new List<string>(); Database db = HostApplicationServices.WorkingDatabase; Document doc = Application.DocumentManager.MdiActiveDocument; SetFocus(doc.Window.Handle); //选择完文件在切换焦点 //锁定文档 using (DocumentLock acLckDoc = doc.LockDocument()) { //设置选择集过滤器选取块 比如图框 TypedValue[] typeValue = new TypedValue[] { new TypedValue((int)DxfCode.BlockName,"TKA3(297X420)GZED_$2018.07") // 你自己的块名称 }; SelectionSet acSSet = this.SelectSsGet("GetSelection", null, typeValue); if (acSSet != null) { foreach (SelectedObject selObj in acSSet) { // 确认返回的是合法的SelectedObject对象 if (selObj != null) // { //开始启动事物调整文字位置点和对齐点 using (Transaction trans = db.TransactionManager.StartTransaction()) { BlockReference brf = trans.GetObject(selObj.ObjectId, OpenMode.ForWrite) as BlockReference; lstAddStr.Add(brf.Position.ToString());//获取块参照的坐标 } } } } } //数据接下来输出到EXCEL表格 IWorkbook wk = null; //新建IWorkbook对象 string localFilePath = "D:\\块参照坐标.xlsx"; // 调用一个系统自带的保存文件对话框 写一个EXCEL SaveFileDialog saveFileDialog = new SaveFileDialog(); //新建winform自带保存文件对话框对象 saveFileDialog.Filter = "Excel Office97-2003(*.xls)|*.xls|Excel Office2007及以上(*.xlsx)|*.xlsx"; //过滤只能存储的对象 DialogResult result = saveFileDialog.ShowDialog(); //显示对话框 localFilePath = saveFileDialog.FileName.ToString(); //07版之前和之后创建方式不一样 if (localFilePath.IndexOf(".xlsx") > 0) // 2007版 { wk = new XSSFWorkbook(); //创建表格对象07版之后 } else if (localFilePath.IndexOf(".xls") > 0) // 创建表格对象 2003版本 { wk = new HSSFWorkbook(); //03版 } //创建工作簿 ISheet tb = wk.CreateSheet("输出坐标数据"); for (int i = 0; i < lstAddStr.Count; i++) { ICell cell = tb.CreateRow(i).CreateCell(0); //单元格对象 第i行第0列 cell 单元格对象 cell.SetCellValue(lstAddStr[i]);//循环往单元格赋值 } //创建文件 using (FileStream fs = File.OpenWrite(localFilePath)) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件! { wk.Write(fs); //文件IO 创建EXCEL MessageBox.Show("已经成功输出块坐标^_^!"); fs.Close(); }
/// /// 获取选择集 /// /// 选择方式 /// 选择点集合 /// 过滤参数 /// public SelectionSet SelectSsGet(string selectStr, Point3dCollection point3dCollection, TypedValue[] typedValue) { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; // 将过滤条件赋值给SelectionFilter对象 SelectionFilter selfilter = null; if (typedValue != null) { selfilter = new SelectionFilter(typedValue); } // 请求在图形区域选择对象 PromptSelectionResult psr; if (selectStr == "GetSelection") // 提示用户从图形文件中选取对象 { psr = ed.GetSelection(selfilter); } else if (selectStr == "SelectAll") //选择当前空间内所有未锁定及未冻结的对象 { psr = ed.SelectAll(selfilter); } else if (selectStr == "SelectCrossingPolygon") //选择由给定点定义的多边形内的所有对象以及与多边形相交的对象。多边形可以是任意形状,但不能与自己交叉或接触。 { psr = ed.SelectCrossingPolygon(point3dCollection, selfilter); } // 选择与选择围栏相交的所有对象。围栏选择与多边形选择类似,所不同的是围栏不是封闭的, 围栏同样不能与自己相交 else if (selectStr == "SelectFence") { psr = ed.SelectFence(point3dCollection, selfilter); } // 选择完全框入由点定义的多边形内的对象。多边形可以是任意形状,但不能与自己交叉或接触 else if (selectStr == "SelectWindowPolygon") { psr = ed.SelectWindowPolygon(point3dCollection, selfilter); } else if (selectStr == "SelectCrossingWindow") //选择由两个点定义的窗口内的对象以及与窗口相交的对象 { Point3d point1 = point3dCollection[0]; Point3d point2 = point3dCollection[1]; psr = ed.SelectCrossingWindow(point1, point2, selfilter); } else if (selectStr == "SelectWindow") // 选择完全框入由两个点定义的矩形内的所有对象。 { Point3d point1 = point3dCollection[0]; Point3d point2 = point3dCollection[1]; psr = ed.SelectCrossingWindow(point1, point2, selfilter); } else { return null; } // 如果提示状态OK,表示对象已选 if (psr.Status == PromptStatus.OK) { SelectionSet sSet = psr.Value; ed.WriteMessage("Number of objects selected: " + sSet.Count.ToString() + "\n");// 打印选择对象数量 return sSet; } else { // 打印选择对象数量 ed.WriteMessage("Number of objects selected 0 \n"); return null; } }
就到这吧!
哦,有人问封面,这是你该关注的吗?
好吧
每一期封面与文章内容无关,纯看个人喜好!
winform 获取焦点_AutoCAD .NET 二次开发实例(13) 获取块参照坐标并输出到Excel相关推荐
- C#之CAD二次开发实例 (13) 图层操作
# 0. 引言 图层在CAD中也是一个重要的角色,自然而然二次开发也必不可少,先来回顾一下图形数据库,也就是下面这个东西 Database db = HostApplicationServices.W ...
- winform界面嵌入dwg图纸_AutoCAD .NET 二次开发实例(6) winform交互界面(一)
# 0 引言 当你想要把平时做的一些小功能集成到一个插件工具时,交互界面就来了,通过添加各种控件按钮,通过事件,然后就可以调用你的小程序功能. 事件,你可以理解成动作,点击.双击鼠标,键盘事件等等,就 ...
- solidworks api二次开发实例详解_Solidworks开发语言对比及分析
很多初学Solidworks二次开发的同学,也许都会纠结使用何种语言进行二次开发.对于Solidworks二次开发的语言,官方有VBA,VB.NET,C#以及C++,四种语言. 用户通常会有如下疑问, ...
- python对abaqus本构二次开发_基于Python的Abaqus二次开发实例讲解
第 1 页 共 11 页 基于 Python 的 Abaqus 二次开发实例讲解 ( asian58 2013.6.26 ) 基于 Python 的 Abaqus 的二次开发便捷之处在于: 1 .所有 ...
- oa java 二次开发_泛微OA ecology 二次开发实例 开发完整.doc
泛微OA ecology 二次开发实例 开发完整 二次开发培训文档 ECOLOGY系统框架结构 主要的程序结构 Ecology Classbean 存放编译后的CLASS文件 js 系统中使用的JAV ...
- OpenSees二次开发实例02
一个记录器的二次开发过程 前言 过程 结语 前言 本文介绍了一个源代码中附带的记录器的二次开发过程,记录器的h和cpp文件是源代码自带的.这次花费了我3天的时间,才实现了记录器的添加. 过程 本记录器 ...
- Python 语言 SAP2000 二次开发 实例
目 录 Blog Links Remarks Example Blog Links DalNur | 博客总目录 Python语言 SAP2000 二次开发 -- 概述 Python语言 SAP200 ...
- lisp 圆柱螺旋线_Auto LISP对AutoCAD2002进行二次开发实例——绘制二维函数曲线
Auto LISP 对 AutoCAD 2002 进行二次开发实例 ---绘制二维函数曲线Ξ李旭荣 ,任奕玲 ,梁秀英 ,刘梅英 (华中农业大学 工程技术学院 ,湖南 武汉 430070) 摘 要:主 ...
- 基于python的abaqus二次开发_基于PYTHON的ABAQUS二次开发实例讲解
第 1 页 共 11 页 基于 Python 的 Abaqus 二次开发实例讲解 ( asian58 2013.6.26 ) 基于 Python 的 Abaqus 的二次开发便捷之处在于: 1 .所有 ...
最新文章
- 各个数据库取前10行记录
- Visual Studio 2008 和 .NET 3.5 发布了
- AI技术出海 - 阿里云GPU服务器助力旷视勇夺4项世界第一
- debian 安装_如何在 Debian/Ubuntu 上手动安装安全更新? | Linux 中国
- Java多线程之并发协作生产者消费者设计模式
- flask-mail异步发送邮件_.NET Core使用FluentEmail发送邮件
- 泸州计算机专业学院,泸州计算机专业中职推荐
- NLP数据挖掘基础知识
- 【干货】打造优秀B端产品需求分析流程要点
- 综合日语第一册第十四课
- 解决办法:对uncompress未定义的引用
- 【FXP】连接站点并上传包文件:
- 树莓派应用:无线扫描仪
- mysql数据库无法插入中文
- 004-2018-09-06 列表
- 迁移selenium脚本迁移后出现unknown error: DevToolsActivePort file doesn‘t exis
- 【打卡】许可证密钥格式(简单)
- 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
- 【干货长文】诺亚财富解读市场信息心理学
- 软件即服务:如何构建 SaaS 应用程序
热门文章
- TypeScript,初次见面,请多指教 ?
- 前端JS笔试面试题目
- HTTP Status 500 - An exception occurred processing JSP page /common/../left.jsp at line 20
- 如何查看自己运行ubuntu是32位还是64位
- 阿里云、小米、华为手机竞争对比初评
- 测量仪图片_介绍一款电线电缆检测智能影像测量仪
- cad 打开硬件加速卡_老司机手把手带你解决,各种CAD疑难杂症
- Spring高级之Spring事务详解(用法、传播行为、隔离级别、只读事务、事务条件)
- 作为开发,你对进程和线程能否区分开来呢?
- python智能工厂_智能工厂关键技术应用 第八讲 智能工厂的Python编程应用