明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1257|回复: 1

如何通过c#炸开代理对象ACAD_PROXY_ENTITY

[复制链接]
发表于 2020-11-26 14:39:06 | 显示全部楼层 |阅读模式
网上下载的代码,可惜不能炸开ACAD_PROXY_ENTITY对象。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.ApplicationServices;

  9. namespace ExplodeProxyMgd
  10. {
  11.     public class ExplodeProxy
  12.     {
  13.         
  14.         /// <summary>
  15.         /// Explode proxy entity to blockreference
  16.         /// Return string name of blockreference in drawing database
  17.         /// </summary>
  18.         /// <param name="rbArgs">Lisp arguments: entity objectId, string BlockPrefix</param>
  19.         /// <returns>string BlockReference name</returns>
  20.         [LispFunction("proxy-explode-to-block")]
  21.         public static TypedValue ProxyExplodeToBlock(ResultBuffer rbArgs)
  22.         {
  23.             Document doc = Application.DocumentManager.MdiActiveDocument;
  24.             Database db = doc.Database;
  25.             Editor ed = doc.Editor;

  26.             TypedValue res = new TypedValue((int)LispDataType.Text,"");

  27.             if (rbArgs.AsArray().Length == 2)
  28.             {
  29.                 TypedValue entity = rbArgs.AsArray()[0];
  30.                 TypedValue blkPrefix = rbArgs.AsArray()[1];
  31.                
  32.                 if ((entity.TypeCode == (int)LispDataType.ObjectId) && (blkPrefix.TypeCode == (int)LispDataType.Text))
  33.                 {
  34.                     using (Transaction tr = doc.TransactionManager.StartTransaction())
  35.                     {
  36.                         try
  37.                         {
  38.                             ObjectId id = (ObjectId)entity.Value;
  39.                             DBObjectCollection objs = new DBObjectCollection();
  40.                             BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);

  41.                             Entity entx = (Entity)tr.GetObject(id, OpenMode.ForWrite);
  42.                             entx.Explode(objs);

  43.                             string blkName = blkPrefix.Value.ToString() + entx.Handle.ToString();

  44.                             if (bt.Has(blkName) == false)
  45.                             {
  46.                                 BlockTableRecord btr = new BlockTableRecord();
  47.                                 btr.Name = blkName;

  48.                                 bt.UpgradeOpen();
  49.                                 ObjectId btrId = bt.Add(btr);
  50.                                 tr.AddNewlyCreatedDBObject(btr, true);

  51.                                 foreach (DBObject obj in objs)
  52.                                 {
  53.                                     Entity ent = (Entity)obj;
  54.                                     btr.AppendEntity(ent);
  55.                                     tr.AddNewlyCreatedDBObject(ent, true);
  56.                                 }
  57.                             }
  58.                             res = new TypedValue((int)LispDataType.Text, blkName);

  59.                             tr.Commit();
  60.                         }
  61.                         catch (Autodesk.AutoCAD.Runtime.Exception ex)
  62.                         {
  63.                             tr.Abort();
  64.                             ed.WriteMessage(ex.Message);
  65.                         }
  66.                     }
  67.                 }
  68.             }
  69.             return res;
  70.         }

  71.         /// <summary>
  72.         /// Explode proxy entity in place
  73.         /// </summary>
  74.         /// <param name="rbArgs">entity name</param>
  75.         [LispFunction("proxy-explode-in-place")]
  76.         public static void ProxyExplodeInPlace(ResultBuffer rbArgs)
  77.         {
  78.             Document doc = Application.DocumentManager.MdiActiveDocument;
  79.             Database db = doc.Database;
  80.             Editor ed = doc.Editor;

  81.             if (rbArgs.AsArray().Length == 1)
  82.             {
  83.                 TypedValue entity = rbArgs.AsArray().First();

  84.                 if (entity.TypeCode == (int)LispDataType.ObjectId)
  85.                 {
  86.                     using (Transaction tr = doc.TransactionManager.StartTransaction())
  87.                     {
  88.                         try
  89.                         {
  90.                             ObjectId id = (ObjectId)entity.Value;
  91.                             DBObjectCollection objs = new DBObjectCollection();
  92.                             BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);

  93.                             Entity entx = (Entity)tr.GetObject(id, OpenMode.ForWrite);
  94.                             entx.Explode(objs);

  95.                             entx.Erase();

  96.                             BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

  97.                             foreach (DBObject obj in objs)
  98.                             {
  99.                                 Entity ent = (Entity)obj;
  100.                                 btr.AppendEntity(ent);
  101.                                 tr.AddNewlyCreatedDBObject(ent, true);
  102.                             }

  103.                             tr.Commit();
  104.                         }
  105.                         catch (Autodesk.AutoCAD.Runtime.Exception ex)
  106.                         {
  107.                             tr.Abort();
  108.                             ed.WriteMessage(ex.Message);
  109.                         }                        
  110.                     }
  111.                 }
  112.             }
  113.         }
  114.     }
  115. }

发表于 2020-11-27 11:47:28 | 显示全部楼层
ExplodeProxy提供了供lisp调用的函数,只是只有arx文件,没有源码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 04:27 , Processed in 0.136462 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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