明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3878|回复: 8

[分享]插入外部文件中块的C#实现方法

  [复制链接]
发表于 2010-10-8 10:42:00 | 显示全部楼层 |阅读模式
  1. ////插入块
  2. private static bool InsertBlock(string strBlockName, string strFilePath)
  3. {
  4. if (strBlockName.CompareTo("") == 0 || strFilePath.CompareTo("") == 0)
  5. {
  6. return false;
  7. }
  8. Autodesk.AutoCAD.ApplicationServices.Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  9. if (!System.IO.File.Exists(strFilePath))
  10. {
  11. CGcEditor.ShowMessage(string.Format("\nInput file :{0} no existed !", strFilePath));
  12. return false;
  13. }
  14. using (Transaction tr = doc.TransactionManager.StartTransaction())
  15. {
  16. using (Database db = new Database(false, true))
  17. {
  18. db.ReadDwgFile(strFilePath, System.IO.FileShare.Read, true, null);
  19. Autodesk.AutoCAD.DatabaseServices.TransactionManager trMag = db.TransactionManager;
  20. using (Transaction trm = trMag.StartTransaction())
  21. {
  22. BlockTable sourceBlkTbl = (BlockTable)trm.GetObject(
  23. db.BlockTableId, OpenMode.ForRead, false);
  24. if (! sourceBlkTbl.Has(strBlockName))
  25. {
  26. return false;
  27. }
  28. ObjectIdCollection blockIds = new ObjectIdCollection();
  29. blockIds.Add(sourceBlkTbl[strBlockName]);
  30. IdMapping IdMap = new IdMapping();
  31. db.WblockCloneObjects(blockIds, doc.Database.BlockTableId, IdMap, DuplicateRecordCloning.Replace, false);
  32. }
  33. }
  34. tr.Commit();
  35. }
  36. return true;
  37. }
  38. public static ObjectId InsertBlock(string strFilePath, string strBlockName, Point3d insertPt)
  39. {
  40. ObjectId objId = new ObjectId();
  41. if (strBlockName.CompareTo("") == 0 || strFilePath.CompareTo("") == 0)
  42. {
  43. return objId;
  44. }
  45. if (!System.IO.File.Exists(strFilePath))
  46. {
  47. CGcEditor.ShowMessage(string.Format("\nInput file :{0} no existed !", strFilePath));
  48. return objId;
  49. }
  50. Autodesk.AutoCAD.ApplicationServices.Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  51. using (Transaction tr = doc.TransactionManager.StartTransaction())
  52. {
  53. BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
  54. if (! bt.Has(strBlockName))
  55. {
  56. if (! InsertBlock(strBlockName, strFilePath))
  57. {
  58. return objId;
  59. }
  60. }
  61. BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  62. using (BlockReference newBlkRef = new BlockReference(insertPt, bt[strBlockName]))
  63. {
  64. //Matrix3d mat3d = Matrix3d.Rotation(dbAngle, Vector3d.ZAxis, insertPt);
  65. //bref.TransformBy(mat3d);
  66. objId = btr.AppendEntity(newBlkRef);
  67. tr.AddNewlyCreatedDBObject(newBlkRef, true);
  68. }
  69. tr.Commit();
  70. tr.Dispose();
  71. }
  72. return objId;
  73. }

评分

参与人数 1威望 +1 明经币 +1 收起 理由
雪山飞狐_lzh + 1 + 1 【好评】好程序

查看全部评分

发表于 2010-10-26 21:25:00 | 显示全部楼层
本帖最后由 作者 于 2010-10-26 22:45:34 编辑

如果原块有属性,则这种方法插入的块参照中属性值会丢掉,改为:
  1.        public static ObjectId m_InsertBlockRef(ObjectId blockId, Point3d insertPt)
  2.         {
  3.             ObjectId blockRefId = ObjectId.Null;
  4.             using (Transaction tr = mCommands.m_db.TransactionManager.StartTransaction())
  5.             {
  6.                 BlockTableRecord btr = tr.GetObject(mCommands.m_db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  7.                
  8.                 BlockReference bref = new BlockReference(insertPt, blockId);//新建块参照,注意此时无属性参照
  9.                 blockRefId = btr.AppendEntity(bref);//先加入数据库块表记录中
  10.                 #region 加入默认属性
  11.                 BlockTableRecord btrBlock = tr.GetObject(blockId, OpenMode.ForRead) as BlockTableRecord;
  12.                 if (btrBlock.HasAttributeDefinitions)
  13.                 {
  14.                     foreach (ObjectId id in btrBlock)
  15.                     {
  16.                         DBObject ent = tr.GetObject(id, OpenMode.ForRead) as DBObject;
  17.                         if (ent is AttributeDefinition)
  18.                         {
  19.                             AttributeDefinition attdef = ent as AttributeDefinition;//取得块的属性定义
  20.                             AttributeReference attref = new AttributeReference();//新建属性参照
  21.                             attref.SetPropertiesFrom(attdef);
  22.                             attref.SetAttributeFromBlock(attdef, Matrix3d.Displacement(btrBlock.Origin.GetVectorTo(insertPt)));//复制属性
  23.                             bref.AttributeCollection.AppendAttribute(attref);//附着属性参照
  24.                             tr.AddNewlyCreatedDBObject(attref, true);                           
  25.                         }
  26.                     }
  27.                 }               
  28.                 #endregion
  29.                 tr.AddNewlyCreatedDBObject(bref,true);
  30.                 tr.Commit();
  31.             }
  32.             return blockRefId;
  33.         }
  34.     }
发表于 2010-10-31 18:04:00 | 显示全部楼层
学习了,一定要顶
发表于 2011-1-10 16:56:30 | 显示全部楼层
好东西 顶啊!!!
有这样肯分享的高手我们这样的小兵才有希望升级。致敬一下!!
发表于 2012-4-14 10:42:39 | 显示全部楼层
楼主辛苦了,正好不知道怎么插入外来块!!!!
发表于 2012-4-14 11:06:13 | 显示全部楼层
这个好,最近正在研究使用C#进行cad二次开发,多谢!
发表于 2012-5-29 11:16:50 | 显示全部楼层
楼主,不知道这些块是怎么影响块的图形的呢?
发表于 2012-5-29 16:13:05 | 显示全部楼层
mkhsj929 发表于 2010-10-26 21:25
如果原块有属性,则这种方法插入的块参照中属性值会丢掉,改为:

学习学习 ,不错、、、、、、、
发表于 2014-6-26 09:46:07 来自手机 | 显示全部楼层
mkhsj929 发表于 2010-10-26 21:25  如果原块有属性,则这种方法插入的块参照中属性值会丢掉,改为:

但是按这种方法,为什么最后属性的注记的位置始终不是自己想要的结果?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:38 , Processed in 0.161556 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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