CAD 二次开发----- 块

        /// <summary>
        /// 插入一个块参照到CAD图形中
        /// </summary>
        /// <param name="spaceId">模型空间Id</param>
        /// <param name="layer">要插入的图层名</param>
        /// <param name="blockName">块名</param>
        /// <param name="postion">插入点</param>
        /// <param name="scale">缩放比例</param>
        /// <param name="rotateAngle">旋转角度</param>
        /// <returns></returns>
        public static ObjectId InsertBlockTableRecord(this ObjectId spaceId, string layer, string blockName, Point3d postion, Scale3d scale, double rotateAngle)
        {

            ObjectId blockRefId;//存储要插入的块参照的Id

            Database db = spaceId.Database;//获取数据库对象

            BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;

            if (!bt.Has(blockName))

                return ObjectId.Null;//如果没有blockName的块,程序返回

            //以写的方式打开空间
            BlockTableRecord space = spaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
            //创建块参照的插入点
            BlockReference br = new BlockReference(postion, bt[blockName]);
            br.ScaleFactors = scale;

            br.Layer = layer;

            br.Rotation = rotateAngle;
            blockRefId = space.AppendEntity(br);

            db.TransactionManager.AddNewlyCreatedDBObject(br, true);

            space.DowngradeOpen();

            return blockRefId;//返回添加的块参照的ID 

        }

  

        /// <summary>
        /// 插入一个块参照到CAD图形中
        /// </summary>
        /// <param name="spaceId">模型空间Id</param>
        /// <param name="layer">要插入的图层名</param>
        /// <param name="blockName">块名</param>
        /// <param name="postion">插入点</param>
        /// <param name="scale">缩放比例</param>
        /// <param name="rotateAngle">旋转角度</param>
        /// <returns></returns>
        public static ObjectId InsertBlockTableRecord(this ObjectId spaceId, string layer, string blockName, Point3d postion, Scale3d scale, double rotateAngle)
        {

            ObjectId blockRefId;//存储要插入的块参照的Id

            Database db = spaceId.Database;//获取数据库对象

            BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;

            if (!bt.Has(blockName))

                return ObjectId.Null;//如果没有blockName的块,程序返回

            //以写的方式打开空间
            BlockTableRecord space = spaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
            //创建块参照的插入点
            BlockReference br = new BlockReference(postion, bt[blockName]);
            br.ScaleFactors = scale;

            br.Layer = layer;

            br.Rotation = rotateAngle;
            blockRefId = space.AppendEntity(br);

            db.TransactionManager.AddNewlyCreatedDBObject(br, true);

            space.DowngradeOpen();

            return blockRefId;//返回添加的块参照的ID 

        }

在CAD中插入一个块参照

/// <summary>
        /// 创建一个块,添加到数据库中
        /// </summary>
        /// <param name="db"></param>
        /// <param name="blockName"></param>
        /// <param name="ents"></param>
        /// <returns></returns>
        public static ObjectId AddBlockTableRecord(this Database db, string blockName, List<Entity> ents)
        {
            BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);

            if (!bt.Has(blockName))
            {
                BlockTableRecord btr = new BlockTableRecord();

                btr.Name = blockName;
                //将列表中的实体加入到新建的BlockTableRecord
                ents.ForEach(ent => btr.AppendEntity(ent));

                bt.UpgradeOpen();//切换块为写的状态

                bt.Add(btr);

                db.TransactionManager.AddNewlyCreatedDBObject(btr, true);

                bt.DowngradeOpen();//切换块为读的状态

            }

            return bt[blockName];
        }

  

原文地址:https://www.cnblogs.com/civil/p/10116870.html

时间: 2024-10-14 21:42:54

CAD 二次开发----- 块的相关文章

CAD 二次开发----- 块(一)

1.块定义与块参照两个概念 块定义类似于模具,而块参照类似于模具浇筑出来的模型,在图形中只需用块定义来保存块的实际几何组成,而仅用插入点和比例因子来存储块定义,因为块参照的几何形状与快参照完全一样,仅大小不同, 好处有: 不需要存储款块参照中的实体,减小了图形文件: 只需要修改块定义,块参照会自动更新,减轻了修改和维护工作. 2 .实例代码 创建一个块并添加到数据库中 /// <summary> /// 插入一个块参照到CAD图形中 /// </summary> /// <p

C#进行CAD二次开发环境配置

最近被公司分配到了做CAD二次开发.也是初次接触这方面的东西,其实是有些无从下手的感觉.因为公司这边也没有人有时间带我,只能是自己看书,然后再写一些Demo,再结合实际的应用来一点点的学习.废话不多说,推荐一本我入门的书籍,就是李冠亿先生的<深居浅出AutoCAD二次开发>,写的非常不错,把这本书中的Demo自己手写一遍大概就能知道CAD二次开发到底是个什么东西了. 开发环境配置 开发环境 Win10 x64 CAD 2010 Visual Studio 2012 环境配置 首先要安装CAD软

CAD二次开发中浮动面板不浮动的问题

CAD二次开发中创建了一个浮动面板,想让它创建出来后以浮动状态显示, 但是DockSides.None设置完后,面板还是不浮动.搞了很久,最后原来是 需要先设置Visible,再设置DockSides,这样就好了. ps = new PaletteSet("PSCollectPart"); ps.Style = PaletteSetStyles.NameEditable | PaletteSetStyles.ShowPropertiesMenu | PaletteSetStyles.S

CAD二次开发控件,dwg控件,网页DWG控件,手机浏览编辑DWG控件

梦想绘图插件5.2(MxDraw5.2) 是国内最强,最专业的CAD开发插件(控件),不需要AutoCAD就能独立运行. 控件使用VC 2010开发,具有30万行代码规模,最早从2007年第一个版本完成,经过多年的累积已经非常稳定可靠,功能完善.有关键的空间搜索算法,并使用汇编优化,可以处理50万级实体,图形的显示和处理效率比同类产品高出很多. 梦想绘图3d插件6.0(MxDraw6.03d),使用二维控件的显示核心,基于 OpenCASCADE 几何造型引擎, 创建锥.柱.环等基本几何体, 对

CAD二次开发---导入外部文件中的块并输出预览图形(五)

思路: 1)首先要定义一个数据库对象来表示包含块的文件,改数据库对象会被加载到内存中,但不会被显示在CAD窗口中. 2)调用Database类的ReadDwgFile函数将外部文件DWG文件读入到新创建的数据库对象中. 3)最后调用Database类的WblockCloneObjects函数将外部的DWG文件中块对象复制到当前数据库中. 1 /// <summary> 2 /// 外部文件导入块, 3 /// </summary> 4 /// <param name=&quo

CAD二次开发 - 可缩放块(四)

1.说明 可进行缩放性注释的对象有:文字.标注.图案填充.公差.多重引线.块及属性. 2.为图形添加.删除注释比例步骤 1)使用AnnotationScale类(在DatabaseServices命名空间下)构造函数创建注释比例对象并设置相关属性: 2)使用图形的注释比例列表(ObjectContextCollection): 3)使用(ObjectContextCollection类)的AddText函数将新建的注释比例对象添加到注释比例列表中. 2.具体代码 1 public static

基于C#编程语言的CAD二次开发技术---展测量点坐标

一.引言       AutoCAD 是目前世界上功能最强大的绘图软件.在测绘行业,使用 AutoCAD 直接绘图,或用以 AutoCAD 为平台开发出的各种绘图软件来绘图,大大提高了绘图的精度.准度和速度.今天介绍一下如何用C#编写将野外测量点坐标展入到 AutoCAD 的.NET程序集. 二.知识准备      1.了解dat坐标文件的格式,本次以常用格式 “ 点名,编码,东坐标,北坐标,高程 ”  为例.      2.文件读取,字符串处理      3.AutoCAD .NET 开发基础

基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象

1.CAD对象:一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点.多段线.文字.圆等)和看不见(图层.线型.颜色等)的都是对象,数据库本身也是一个对象. 直线.圆弧.文字和标注等图形对象都是对象. 线型与标注样式等样式设置都是对象. 图层.编组和块等组织结构都是对象. 视图与视口等图形显示都是对象. 甚至图形和 AutoCAD 应用程序本身也是对象. 2.CAD中的容器:对于任何一个DWG文件,都会创建下列容器对像:九个固定的符号表(如下)和有名对像字典(包含

cad二次开发--添加对象到模型空间中

通过实体名来将实体加入到模型空间 AcDbObjectId PostToModelSpace(AcDbEntity *pEnt){ //打开块表 AcDbBlockTable *pBlockTable = NULL; Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlockTable, AcDb::kForRead); //打开块表记录 AcDbBlockTabl