明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1806|回复: 2

[资源] 创建图块,有同名图块时自动覆盖

[复制链接]
发表于 2018-4-13 09:08:55 | 显示全部楼层 |阅读模式
折腾了很久最后发现是建块的时候没有对齐坐标原点。多谢 AutoCAD.NetApi群(2474812)的[C#]非狐、[c#lisp]惊惊、[lisp C#]若海、小贱贱等前辈或同学的帮助,现把实现代码贴出来,希望能帮到大家。
  1.         /// <summary>
  2.         /// 创建图块图块,有重名图块的时候会被覆盖
  3.         /// </summary>
  4.         public static ObjectId CreatBlockBySelection(string blockName)
  5.         {
  6.             Document acDoc = App.DocumentManager.MdiActiveDocument;
  7.             acDoc.LockDocument();
  8.             Database acCurDb = acDoc.Database;
  9.             ObjectId rtn= ObjectId.Null;
  10.             PromptSelectionOptions acSelOpt = new PromptSelectionOptions();
  11.             acSelOpt.MessageForAdding = "\n-->>请选择要创建块的图形";
  12.             PromptSelectionResult acSSPrompt = acDoc.Editor.SelectImplied();
  13.             if (acSSPrompt.Status != PromptStatus.OK)
  14.                 acSSPrompt = acDoc.Editor.GetSelection(acSelOpt);
  15.             if (acSSPrompt.Status == PromptStatus.OK)
  16.             {
  17.                 PromptPointOptions ptOpt = new PromptPointOptions("\n-->>请选择块基点");
  18.                 PromptPointResult ptRt = acDoc.Editor.GetPoint(ptOpt);
  19.                 Point3d insertPoint = ptRt.Value;
  20.                 if (ptRt.Status == PromptStatus.Cancel) rtn=ObjectId.Null;
  21.                 else
  22.                 {
  23.                     SelectionSet acSSet = acSSPrompt.Value;
  24.                     using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  25.                     {
  26.                         BlockTable blkTable = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForWrite) as BlockTable;
  27.                         BlockTableRecord tableRecord = acTrans.GetObject(blkTable[GetSpaceType()], OpenMode.ForWrite) as BlockTableRecord;
  28.                         LayerStateManager lsm = acDoc.Database.LayerStateManager;
  29.                         string lsmName = DateTime.Now.Millisecond.ToString();
  30.                         if (lsm.HasLayerState(lsmName)) lsm.DeleteLayerState(lsmName);
  31.                         lsm.SaveLayerState(lsmName, LayerStateMasks.Frozen | LayerStateMasks.Locked, ObjectId.Null);
  32.                         LayerTable lyTable = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable;
  33.                         foreach (ObjectId lyrcd in lyTable)
  34.                         {
  35.                             LayerTableRecord layer = acTrans.GetObject(lyrcd, OpenMode.ForWrite) as LayerTableRecord;
  36.                             if (layer.Name != "0") layer.IsFrozen = false;
  37.                             layer.IsLocked = false;
  38.                         }
  39.                         BlockTableRecord newBlockTableRecord;
  40.                         if (blkTable.Has(blockName))
  41.                         {
  42.                             newBlockTableRecord = acTrans.GetObject(blkTable[blockName], OpenMode.ForWrite) as BlockTableRecord;
  43.                             foreach (ObjectId id in newBlockTableRecord)
  44.                             {
  45.                                 Entity ent = acTrans.GetObject(id, OpenMode.ForWrite) as Entity;
  46.                                 ent.Erase();
  47.                             }
  48.                             newBlockTableRecord.AssumeOwnershipOf(new ObjectIdCollection(acSSet.GetObjectIds()));
  49.                             Matrix3d mt = Matrix3d.Displacement(Point3d.Origin - insertPoint);
  50.                             foreach (ObjectId id in newBlockTableRecord)
  51.                             {
  52.                                 Entity ent = acTrans.GetObject(id, OpenMode.ForWrite) as Entity;
  53.                                 ent.TransformBy(mt);
  54.                             }
  55.                         }
  56.                         else
  57.                         {
  58.                             newBlockTableRecord = new BlockTableRecord();
  59.                             newBlockTableRecord.Name = blockName;
  60.                             newBlockTableRecord.Origin = Point3d.Origin;
  61.                             blkTable.Add(newBlockTableRecord);
  62.                             acTrans.AddNewlyCreatedDBObject(newBlockTableRecord, true);
  63.                             Matrix3d mt = Matrix3d.Displacement(Point3d.Origin - insertPoint);
  64.                             ObjectIdCollection objCol = new ObjectIdCollection();
  65.                             foreach (ObjectId id in acSSet.GetObjectIds())
  66.                             {
  67.                                 Entity ent = acTrans.GetObject(id, OpenMode.ForWrite) as Entity;
  68.                                 ent.TransformBy(mt);
  69.                                 objCol.Add(id);
  70.                             }
  71.                             newBlockTableRecord.AssumeOwnershipOf(objCol);
  72.                         }
  73.                         rtn = blkTable[blockName];
  74.                         BlockReference blockReference = new BlockReference(insertPoint, rtn);
  75.                         tableRecord.AppendEntity(blockReference);
  76.                         acTrans.AddNewlyCreatedDBObject(blockReference, true);
  77.                         lsm.RestoreLayerState(lsmName, ObjectId.Null, 0, LayerStateMasks.Frozen | LayerStateMasks.Locked);
  78.                         lsm.DeleteLayerState(lsmName);
  79.                         acTrans.Commit();
  80.                     }
  81.                 }
  82.                 acDoc.Editor.Regen();
  83.             }
  84.             return rtn;
  85.         }

  86.         [CommandMethod("tt1", CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Modal | CommandFlags.NoBlockEditor)]
  87.         public static void tt1()
  88.         {
  89.             CreatBlockBySelection("newBlock");
  90.         }

发表于 2018-8-5 13:58:01 | 显示全部楼层
谢谢大佬分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 00:54 , Processed in 0.178786 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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