AutoCAD中添加块和块参照(转载)

块参照就是AutoCAD中的图块,它引用于块定义(即添加到块表的块表记录)。而块定义有两种形式:1、引用外部DWG图纸。2、种是图纸中添加在块表中的块表记录。 以下是块定义引用为块参照的例子:

using System;

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

[assembly: CommandClass(typeof(Sample.AddBlock))]
namespace Sample
{
    class AddBlock
    {
        /// <summary>
        /// 引用外部文件为块参照插入
        /// </summary>
        [CommandMethod("AddRefBlock")]
        public void Add1()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                ObjectId refid = db.OverlayXref(@"c:\drwing.dwg", "name");// 通过外部文件获取图块定义的ObjectId
                BlockReference br = new BlockReference(Point3d.Origin, refid); // 通过块定义添加块参照
                btr.AppendEntity(br); //把块参照添加到块表记录
                trans.AddNewlyCreatedDBObject(br, true); // 通过事务添加块参照到数据库
                trans.Commit();
            }
        }

        /// <summary>
        /// 把块定义变为块参照插入
        /// </summary>
        [CommandMethod("AddBlock")]
        public void Add2()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            ObjectId blkid;

            //创建块定义
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                BlockTableRecord blk = new BlockTableRecord();
                blk.Name = "BLK";
                Line L = new Line(Point3d.Origin, new Point3d(1000, 1000, 0));
                Circle C = new Circle(Point3d.Origin, Vector3d.ZAxis, 500);
                blk.AppendEntity(L);
                blk.AppendEntity(C);
                blkid = bt.Add(blk);
                trans.AddNewlyCreatedDBObject(blk, true);
                trans.Commit();
            }

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                BlockReference br = new BlockReference(new Point3d(0,0, 0), blkid); // 通过块定义创建块参照
                btr.AppendEntity(br); //把块参照添加到块表记录
                tr.AddNewlyCreatedDBObject(br, true); // 通过事务添加块参照到数据库
                tr.Commit();
            }
        }
    }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 AutoCAD 的 .NET API 来替换外部,以下是一个示例代码: ```csharp // 打开 AutoCAD 文档 Document doc = Application.DocumentManager.Open(filePath, false); // 获取数据库 Database db = doc.Database; // 开启事务 using (Transaction tr = db.TransactionManager.StartTransaction()) { // 获取表 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // 获取表记录 BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // 遍历表记录的实体 foreach (ObjectId entId in btr) { Entity ent = tr.GetObject(entId, OpenMode.ForRead) as Entity; // 判断实体是否为参照 if (ent is BlockReference) { BlockReference blkRef = ent as BlockReference; // 判断参照是否为待替换的 if (blkRef.Name.Equals(oldBlockName, StringComparison.OrdinalIgnoreCase)) { // 创建新的参照 BlockTableRecord newBtr = tr.GetObject(bt[newBlockName], OpenMode.ForRead) as BlockTableRecord; BlockReference newBlkRef = new BlockReference(blkRef.Position, newBtr.ObjectId); newBlkRef.ScaleFactors = blkRef.ScaleFactors; // 复制属性 newBlkRef.CopyFrom(blkRef); // 替换参照 blkRef.UpgradeOpen(); blkRef.Erase(); btr.AppendEntity(newBlkRef); tr.AddNewlyCreatedDBObject(newBlkRef, true); } } } // 提交事务 tr.Commit(); } ``` 代码,`filePath` 是 AutoCAD 文档的路径,`oldBlockName` 是待替换的的名称,`newBlockName` 是用于替换的新的名称。你需要先将新插入到 AutoCAD 文档,然后才能用它来替换旧

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值