明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 221|回复: 2

【转载】将dwg作为块插入及从新定义块并更新显示

[复制链接]
发表于 前天 16:40 | 显示全部楼层 |阅读模式
本帖最后由 qq1254582201 于 2024-11-4 16:44 编辑
  1. [CommandMethod("ReplaceBlock2")]
  2. public void ReplaceBlock2()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     string blockName = "TEST";
  7.     Database blkDb = new Database(false, true);
  8.     blkDb.ReadDwgFile(@"C:\\Temp\\TEST.dwg", System.IO.FileShare.Read, true, "");
  9.     using (Transaction Tx = db.TransactionManager.StartTransaction())
  10.     {
  11.         BlockTable blockTable = Tx.GetObject(db.BlockTableId, OpenMode.ForRead, false, true);
  12.         ObjectId btrId = db.Insert(blockName, blkDb, true);
  13.         if (btrId != ObjectId.Null)
  14.         {
  15.             BlockTableRecord btr = Tx.GetObject(btrId, OpenMode.ForRead, false, true);
  16.             ObjectIdCollection brefIds = btr.GetBlockReferenceIds(false, true);
  17.             foreach (ObjectId id in brefIds)
  18.             {
  19.                 BlockReference bref = Tx.GetObject(id, OpenMode.ForWrite, false, true);
  20.                 bref.RecordGraphicsModified(true);
  21.             }
  22.         }
  23.         Tx.Commit();
  24.     }
  25.     blkDb.Dispose();
  26. }
插入外部CAD作为块,并更新显示
  1. [CommandMethod("ReplaceBlock1")]
  2. public void ReplaceBlock1()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     string blockName = "TEST";
  7.     using (Transaction Tx = db.TransactionManager.StartTransaction())
  8.     {
  9.         BlockTable blockTable = Tx.GetObject(db.BlockTableId, OpenMode.ForRead, false, true);
  10.         if ((blockTable.Has(blockName)))
  11.         {
  12.             BlockTableRecord btr = Tx.GetObject(blockTable[blockName], OpenMode.ForWrite, false, true);
  13.             // Erase all entities in btr
  14.             foreach (ObjectId id in btr)
  15.             {
  16.                 Entity ent = id.GetObject(OpenMode.ForWrite);
  17.                 ent.Erase();
  18.             }
  19.             // Add new entities to btr
  20.             Line aLine = new Line(new Point3d(50, 50, 0), new Point3d(100, 100, 0));
  21.             btr.AppendEntity(aLine);
  22.             Tx.AddNewlyCreatedDBObject(aLine, true);
  23.             ObjectIdCollection brefIds = btr.GetBlockReferenceIds(false, true);
  24.             // Update blockrefs to display new graphics
  25.             foreach (ObjectId id in brefIds)
  26.             {
  27.                 BlockReference bref = Tx.GetObject(id, OpenMode.ForWrite, false, true);
  28.                 bref.RecordGraphicsModified(true);
  29.             }
  30.             Tx.Commit();
  31.         }
  32.     }
  33. }

修改块对象后更新既有块对象内的显示

发表于 前天 17:00 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2024-11-4 19:16 编辑

你这个例子不好,
插入前要激活数据库,不然会产生文字偏移.
https://www.cnblogs.com/JJBox/p/10226119.html

在IFox提供的事务栈内封装了一个处理,
trans.Task(()=>{
//TODO
db.Insert(..)
  });
来处理
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 09:00 | 显示全部楼层
谢谢楼主分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-6 09:36 , Processed in 0.174109 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表