AutoCad 二次开发 .net 之相同块的自动编号

主要步骤:

一、获取一个块的id:

其中oId就是了。

二、通过次oId获取块引用blkRef:

三、通过它获取所有相同的块引用的id集合:

四、通过步骤三的集合得到所有的块引用得到集合listBr:

五、遍历listBr,创建DBText编号 ,确定DBText在图中插入的位置,加入到集合listDBText:

在做第五步骤前,先要获取TextStyleId:

最后通过扩展方法加入到模型空间:listDBText.ToSpace();

ToSpace方法截图:

需要注意的地方:一定要是块定义,在使用dbText.AlignmentPoint之前一定要写排序方式这里用的是:dbText.HorizontalMode = TextHorizontalMode.TextMid;

完整代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;

namespace MulitySortNum
{
    public class SortNum
    {
        private Document doc = Application.DocumentManager.MdiActiveDocument;
        private Database db = Application.DocumentManager.MdiActiveDocument.Database;
        private Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

        private string str = "LL";
        public int index = 1;

        [CommandMethod("NumSort1")]
        public void NumSort1()
        {
            index = 1;

            var propEnt = new PromptEntityOptions("请选择要编号的一个块\n");

            var propRes = ed.GetEntity(propEnt);

            if (propRes.Status != PromptStatus.OK)
            {
                return;
            }

            var oId = propRes.ObjectId;

            ObjectIdCollection objIds = null;
            List<DBText> listDBText = new List<DBText>();

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
               var blkRef = trans.GetObject(oId, OpenMode.ForRead) as BlockReference;

                if (blkRef == null)
                {
                    Application.ShowAlertDialog("请选择块定义");
                    return;
                }

                var recId = blkRef.BlockTableRecord;

                var blkTblRec = trans.GetObject(recId, OpenMode.ForRead) as BlockTableRecord;

                objIds = blkTblRec.GetBlockReferenceIds(true, false);

                var txtStlTbl = trans.GetObject(db.TextStyleTableId, OpenMode.ForRead) as TextStyleTable;

                var txtstyleId = txtStlTbl["Standard"];

                List<BlockReference> listBr = new List<BlockReference>();

                foreach (ObjectId objectId in objIds)
                {
                   var blkTempRef = trans.GetObject(objectId, OpenMode.ForRead) as BlockReference;

                    listBr.Add(blkTempRef);

                }

                listBr.OrderByDescending(b => b.Position.Y).ToList().ForEach(blkTempRef =>
                {

                    DBText dbText = new DBText();
                    dbText.TextString = str + "_" + index++;
                    dbText.TextStyleId = txtstyleId;

                    var pointMin = blkTempRef.Bounds.Value.MinPoint;
                    var pointMax = blkTempRef.Bounds.Value.MaxPoint;
                    dbText.HorizontalMode = TextHorizontalMode.TextMid;
                    dbText.AlignmentPoint = pointMin + Vector3d.YAxis * 2 + Vector3d.XAxis * Math.Abs(pointMax.X - pointMin.X) / 2;

                    listDBText.Add(dbText);

                });

                trans.Commit();
            }

            listDBText.ToSpace();

        }
    }
}

原文地址:https://www.cnblogs.com/HelloQLQ/p/11823870.html

时间: 2024-10-12 01:25:15

AutoCad 二次开发 .net 之相同块的自动编号的相关文章

AutoCAD二次开发&mdash;&mdash;AutoCAD.NET API开发环境搭建

AutoCAD二次开发--AutoCAD.NET API开发环境搭建 AutoCAD二次开发--AutoCAD.NET API开发环境搭建 AutoCAD二次开发工具:1986年AutoLisp,1989年ADS,1990年DCL,1993年ADS-RX,1995年ObjectARX,1996年Active X Automation(COM),1997年VBA,1998年Visual Lisp,2006年.net API(DLL). 趋势和方向:AutoCAD.net API(AutoCAD20

.NET AutoCAD二次开发之路(一、基础篇)

学习AutoCAD二次开发已经有一段时间了,磕磕碰碰,十分的艰辛枯燥.但回想一下还是会有些小激动,嘿嘿!最近这段时间一直都有这么个想法,就是将我学习CAD二次开发的过程用文字的方式记录下来,形成系列,并定期更新.主要内容就是记录自己每天学习过程中所碰见的问题和感悟,并总结今天所学到的内容.目的一是激励自己坚持下去,看着自己一步一步的提高,多有成就感.还有就是和大家积极沟通,希望能够指正我的错误,减少我的弯路.再者就是望能给后面学习的人一点点借鉴经验,好吧其实还有点装B的心里.废话不多说就进入今天

AutoCAD二次开发-使用ObjectARX向导创建应用程序(HelloWorld例子)

AutoCAD2007+vs2005 首先自己去网上搜索下载AutoCAD2007的ARX开发包. 解压后如下 打开后如下 classmap文件夹为C++类和.net类的框架图,是一个DWG文件. docs帮助文件 inc引用的头文件 lib引用的库文件 redistrib其他引用的库文件 samples例子 utils其他东西 打开utils 上面几个是头文件和库文件 ObjARXWiz这个文件夹是向导(2012以后的版本就没有了,要去官网单独下载,不和开发包在一起) 打开后如下 直接双击安装

1,下载和部署开发环境--AutoCAD二次开发(2020版)

教程说明: 本教程为2019年10月开始编撰,使用CAD官方最新版本的软件和库.对旧版本仍有参考价值. 本教程中使用的各种软件版本为官方指定匹配版本. 本教程需要你拥有编程基础,对于普通编程常识不再敷述.当然,你可以留言提问. 环境需求为: AutoCAD 2020版 ObjectARX SDK 下载地址:https://www.autodesk.com/developer-network/platform-technologies/autocad/objectarx-license-downl

.NET AutoCAD二次开发之路(一、直线篇)

我以前只有一点VB的基础,C语言也只是看过,学这个CAD二次开发,也是借工作之余研究下,我到现在已经从事机械行业5年了,中国的工业设计环境区别太大,各行各业的技术现状也不尽相同,但有一点是可以肯定的,那就是自动化,国外都在工业4.0了,我们还在互联网+,哎太out了,我也赶紧进修下,要不就淘汰了.所以我选择了CAD二次开发,主要还是跟专业接近,希望能越学越精吧,未来就让未来的我去面对! 今天主要总结下直线的创建,要想能在CAD中生成直线或者其他图形,都必须遵循几个步骤,那就是: 1.获取当前图形

AutoCAD二次开发

AutoCAD本身是功能强大.可配置性极高的软件,并且由于AutoCAD良好的软件架构,AutoCAD的二次开发能力也极强,几乎所有可见的软件功能都能在SDK内找到封装好的接口,由于AutoCAD SDK的向后兼容性极好,写出的程序几乎不用修改就可以适用于所有版本的AutoCAD. AutoCAD的第一代开发工具是AutoLISP,是AutoCAD定制的LISP语言,至今仍然是一个活跃的LISP分支,第二代开发工具是基于C语言的ADS,目前来看几乎被淘汰了,也是被AutoDesk公司标记为dep

承接 AutoCAD 二次开发 项目

本人有多年的CAD开发经验,独立完成多个CAD二次开发项目.熟悉.net及Asp.net开发技术,和Lisp开发技术. 现在成立了工作室,独立承接CAD二次开发项目.结项后提供源码及开发文档,有需要的话可以提供发票. 有需求的可以 [email protected] 联系开发事宜.

AutoCad 二次开发 Jig操作之墙块的拖动

测试结果: 主要思路:选择一段多段线,使用封装的jig类进行实时拖动,其原理就是在拖动的时候,确定被拖动的边,我是选择离输入第一个点最近的边作为拖动边,有了这条边,就能确定需要实时更改的点了,然后当鼠标拖动的时候,限制拖动方向只能是X轴或者Y轴变换,详细我在代码里都写了注释的.不足之处就是选择之后,我是把原来的对象复制一份,在删除了原对象,不知道是不是这个原因,Polyline会在选择之后消失,再次点击又出现了.我试了如果直接以写的方式操作原对像,cad会报错,说NotOpenForWrite,

.NET AutoCAD二次开发之路(五、填充篇)

图案填充的创建和其他实体,比如块.文字样式和标注样式有所不同,需区别对待,单大致的方法和步骤都基本相同,只有个别地方不同.要创建 Hatch 对象,首先使用该类的构造函数创建一个空的填充对象,然后对该对象的类型.样式.名称.填充角度以及边界等进行属性设置.步骤如下 1.  创建图案边界: 利用创建圆命令创建一个填充边界 Circle circle = New Circle(); circle.SetDatabaseDefaults();//用来把圆的颜色.图层.线型.打印样式.可见性等属性设为实