找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 215|回复: 0

获取图块里的所有对象(包含子图块的对象)

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-9 11:09:44 | 显示全部楼层 |阅读模式
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.ApplicationServices;
  8. namespace ForeachBlockAllObject
  9. {
  10.     public class Class1
  11.     {
  12.         private static int intLayerNum;
  13.         [Autodesk.AutoCAD.Runtime.CommandMethod("GetBlockObject")]
  14.         public void foreachBlockAllObject()
  15.         {
  16.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  17.             Database db = HostApplicationServices.WorkingDatabase;
  18.             using (DocumentLock docLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
  19.             {
  20.                 //定义过滤器
  21.                 TypedValue[] filList = new TypedValue[1];
  22.                 filList[0] = new TypedValue(0, "Insert");
  23.                 SelectionFilter filter = new SelectionFilter(filList);
  24.                 //选择对象
  25.                 PromptSelectionResult res = ed.GetSelection(filter);
  26.                 if (res.Status == PromptStatus.OK)
  27.                 {
  28.                     intLayerNum = 1;
  29.                     using (Transaction trans = db.TransactionManager.StartTransaction())
  30.                     {
  31.                         //遍历选择集
  32.                         foreach (ObjectId id in res.Value.GetObjectIds())
  33.                         {
  34.                             //获取选择集里的图块
  35.                             BlockReference blockObject = trans.GetObject(id, OpenMode.ForRead) as BlockReference;
  36.                             ed.WriteMessage("***************************************************************\n");
  37.                             //获取图块的块名称
  38.                             ed.WriteMessage("第" + intLayerNum++.ToString("000") + "层 图块名称:" + blockObject.Name + "\n");
  39.                             ed.WriteMessage("===============================================================\n");
  40.                             //获取图块中的所有实体对象
  41.                             getBlockSubEntity(ed, trans, blockObject);
  42.                             ed.WriteMessage("***************************************************************\n");
  43.                         }
  44.                         trans.Commit();
  45.                     }
  46.                 }
  47.             }
  48.         }
  49.         /// <summary>
  50.         /// 获取图块中的所有实体对象
  51.         /// </summary>
  52.         /// <param name="ed"></param>
  53.         /// <param name="trans"></param>
  54.         /// <param name="blockObject"></param>
  55.         private static void getBlockSubEntity(Editor ed, Transaction trans, BlockReference blockObject)
  56.         {
  57.             //获取图块的块表记录
  58.             BlockTableRecord btrBlock = trans.GetObject(blockObject.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  59.             //遍历图块里的所有实体对象
  60.             foreach (ObjectId BlcokId in btrBlock)
  61.             {
  62.                 Entity BlockEntity = trans.GetObject(BlcokId, OpenMode.ForRead) as Entity;
  63.                 if (BlockEntity is BlockReference)
  64.                 {
  65.                     //获取图块的块名称
  66.                     ed.WriteMessage("第" + intLayerNum++.ToString("000") + "层 图块名称:" + ((BlockReference)BlockEntity).Name + "\n");
  67.                     ed.WriteMessage("===============================================================\n");
  68.                     //获取图块中的所有实体对象
  69.                     getBlockSubEntity(ed, trans, (BlockReference)BlockEntity);
  70.                 }
  71.                 ed.WriteMessage("实体对象类型:" + BlockEntity.GetType().ToString() + "\n");
  72.                 ed.WriteMessage("实体objectId:" + BlockEntity.ObjectId + "\n");
  73.                 ed.WriteMessage("实体对象句柄:" + BlockEntity.Handle + "\n");
  74.                 ed.WriteMessage("---------------------------------------------------------------\n");
  75.             }
  76.             ed.WriteMessage("===============================================================\n");
  77.         }
  78.     }
  79. }
复制代码

  1. using System.Reflection;
  2. using System.Runtime.CompilerServices;
  3. using System.Runtime.InteropServices;
  4. // 有关程序集的常规信息通过下列属性集
  5. // 控制。更改这些属性值可修改
  6. // 与程序集关联的信息。
  7. [assembly: AssemblyTitle("ForeachBlockAllObject")]
  8. [assembly: AssemblyDescription("")]
  9. [assembly: AssemblyConfiguration("")]
  10. [assembly: AssemblyCompany("TC")]
  11. [assembly: AssemblyProduct("ForeachBlockAllObject")]
  12. [assembly: AssemblyCopyright("Copyright © TC 2009")]
  13. [assembly: AssemblyTrademark("")]
  14. [assembly: AssemblyCulture("")]
  15. // 将 ComVisible 设置为 false 使此程序集中的类型
  16. // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
  17. // 则将该类型上的 ComVisible 属性设置为 true。
  18. [assembly: ComVisible(false)]
  19. // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
  20. [assembly: Guid("dcd5c6be-8cce-4b70-8528-b6dec48e20cf")]
  21. // 程序集的版本信息由下面四个值组成:
  22. //
  23. //      主版本
  24. //      次版本
  25. //      内部版本号
  26. //      修订号
  27. //
  28. // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
  29. // 方法是按如下所示使用“*”:
  30. // [assembly: AssemblyVersion("1.0.*")]
  31. [assembly: AssemblyVersion("1.0.0.0")]
  32. [assembly: AssemblyFileVersion("1.0.0.0")]
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 06:17 , Processed in 0.154449 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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