点击蓝字关注我

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相关推荐

  1. C#之CAD二次开发实例 (13) 图层操作

    # 0. 引言 图层在CAD中也是一个重要的角色,自然而然二次开发也必不可少,先来回顾一下图形数据库,也就是下面这个东西 Database db = HostApplicationServices.W ...

  2. winform界面嵌入dwg图纸_AutoCAD .NET 二次开发实例(6) winform交互界面(一)

    # 0 引言 当你想要把平时做的一些小功能集成到一个插件工具时,交互界面就来了,通过添加各种控件按钮,通过事件,然后就可以调用你的小程序功能. 事件,你可以理解成动作,点击.双击鼠标,键盘事件等等,就 ...

  3. solidworks api二次开发实例详解_Solidworks开发语言对比及分析

    很多初学Solidworks二次开发的同学,也许都会纠结使用何种语言进行二次开发.对于Solidworks二次开发的语言,官方有VBA,VB.NET,C#以及C++,四种语言. 用户通常会有如下疑问, ...

  4. python对abaqus本构二次开发_基于Python的Abaqus二次开发实例讲解

    第 1 页 共 11 页 基于 Python 的 Abaqus 二次开发实例讲解 ( asian58 2013.6.26 ) 基于 Python 的 Abaqus 的二次开发便捷之处在于: 1 .所有 ...

  5. oa java 二次开发_泛微OA ecology 二次开发实例 开发完整.doc

    泛微OA ecology 二次开发实例 开发完整 二次开发培训文档 ECOLOGY系统框架结构 主要的程序结构 Ecology Classbean 存放编译后的CLASS文件 js 系统中使用的JAV ...

  6. OpenSees二次开发实例02

    一个记录器的二次开发过程 前言 过程 结语 前言 本文介绍了一个源代码中附带的记录器的二次开发过程,记录器的h和cpp文件是源代码自带的.这次花费了我3天的时间,才实现了记录器的添加. 过程 本记录器 ...

  7. Python 语言 SAP2000 二次开发 实例

    目 录 Blog Links Remarks Example Blog Links DalNur | 博客总目录 Python语言 SAP2000 二次开发 -- 概述 Python语言 SAP200 ...

  8. lisp 圆柱螺旋线_Auto LISP对AutoCAD2002进行二次开发实例——绘制二维函数曲线

    Auto LISP 对 AutoCAD 2002 进行二次开发实例 ---绘制二维函数曲线Ξ李旭荣 ,任奕玲 ,梁秀英 ,刘梅英 (华中农业大学 工程技术学院 ,湖南 武汉 430070) 摘 要:主 ...

  9. 基于python的abaqus二次开发_基于PYTHON的ABAQUS二次开发实例讲解

    第 1 页 共 11 页 基于 Python 的 Abaqus 二次开发实例讲解 ( asian58 2013.6.26 ) 基于 Python 的 Abaqus 的二次开发便捷之处在于: 1 .所有 ...

最新文章

  1. 各个数据库取前10行记录
  2. Visual Studio 2008 和 .NET 3.5 发布了
  3. AI技术出海 - 阿里云GPU服务器助力旷视勇夺4项世界第一
  4. debian 安装_如何在 Debian/Ubuntu 上手动安装安全更新? | Linux 中国
  5. Java多线程之并发协作生产者消费者设计模式
  6. flask-mail异步发送邮件_.NET Core使用FluentEmail发送邮件
  7. 泸州计算机专业学院,泸州计算机专业中职推荐
  8. NLP数据挖掘基础知识
  9. 【干货】打造优秀B端产品需求分析流程要点
  10. 综合日语第一册第十四课
  11. 解决办法:对uncompress未定义的引用
  12. 【FXP】连接站点并上传包文件:
  13. 树莓派应用:无线扫描仪
  14. mysql数据库无法插入中文
  15. 004-2018-09-06 列表
  16. 迁移selenium脚本迁移后出现unknown error: DevToolsActivePort file doesn‘t exis
  17. 【打卡】许可证密钥格式(简单)
  18. 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
  19. 【干货长文】诺亚财富解读市场信息心理学
  20. 软件即服务:如何构建 SaaS 应用程序

热门文章

  1. TypeScript,初次见面,请多指教 ?
  2. 前端JS笔试面试题目
  3. HTTP Status 500 - An exception occurred processing JSP page /common/../left.jsp at line 20
  4. 如何查看自己运行ubuntu是32位还是64位
  5. 阿里云、小米、华为手机竞争对比初评
  6. 测量仪图片_介绍一款电线电缆检测智能影像测量仪
  7. cad 打开硬件加速卡_老司机手把手带你解决,各种CAD疑难杂症
  8. Spring高级之Spring事务详解(用法、传播行为、隔离级别、只读事务、事务条件)
  9. 作为开发,你对进程和线程能否区分开来呢?
  10. python智能工厂_智能工厂关键技术应用 第八讲 智能工厂的Python编程应用