明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5814|回复: 22

[图元] 集合对象的相互转换

  [复制链接]
发表于 2010-12-5 22:45 | 显示全部楼层 |阅读模式
本帖最后由 chpmould 于 2010-12-5 22:46 编辑

请教老师:不知能否实现将以下 objId 集合转为 obj 对象
ObjectIdCollection objId = new ObjectIdCollection();

DBObjectCollection obj = new DBObjectCollection();
发表于 2010-12-5 23:05 | 显示全部楼层
本帖最后由 河伯 于 2010-12-5 23:32 编辑

VB.NET的:   

  1. Public Shared Function GetEntity(ByVal objId As ObjectIdCollection) As DBObjectCollection
  2.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  3.         Dim db As Database = doc.Database
  4.         Dim objs As New DBObjectCollection
  5.         Using Trans As Transaction = db.TransactionManager.StartTransaction
  6.             For Each Id As ObjectId In objId
  7.                    obj.Add(Id.GetObject(OpenMode.ForRead))
  8.             Next
  9.             Trans.Commit()
  10.         End Using
  11.         Return obj 'DBObjectCollection
  12.     End Function
发表于 2010-12-5 23:25 | 显示全部楼层
本帖最后由 河伯 于 2010-12-5 23:32 编辑

转成C#:
  1. public static DBObjectCollection GetEntity(ObjectIdCollection objId)
  2. {
  3.         Document doc = Application.DocumentManager.MdiActiveDocument;
  4.         Database db = doc.Database;
  5.         DBObjectCollection obj = new DBObjectCollection();

  6.         using (Transaction Trans = db.TransactionManager.StartTransaction) {
  7.                 foreach (ObjectId Id in objId) {
  8.                        obj.Add(Id.GetObject(OpenMode.ForRead));
  9.                 }
  10.                 Trans.Commit();
  11.         }
  12.         return obj;        //DBObjectCollection
  13. }
 楼主| 发表于 2010-12-6 12:41 | 显示全部楼层
请教老师: 例如我定义cir01集合,需要如何调用你的这个转换函数...
  1. ObjectIdCollection cir01 = new ObjectIdCollection();
  2. cir01.Add(line01);
  3. cir01.Add(line02);

  4. // 我这样调用cir01集合转为 obj 对象不对,请帮助指正...
  5.    DBObject DBobj01 = GetEntity(cir01);
复制代码
发表于 2010-12-6 13:20 | 显示全部楼层
你的返回值要求是DBObjectCollection,赋值给DBObject 当然会错
 楼主| 发表于 2010-12-6 18:42 | 显示全部楼层
本帖最后由 chpmould 于 2010-12-6 18:48 编辑

我现改为:  DBObjectCollection  DBobj01 = GetEntity(cir01);之后还调不成功,一直提示如下信息,请问我错在那里了?

出错提 示信息: 无法将方法组 “ StartTransaction ” 转换为非委托类型 “ Autodesk.AutoCAD.DatabaseServices.Transaction ”。你是要调用方法吗?


发表于 2010-12-6 18:50 | 显示全部楼层
河伯老兄是VB的写法,方法可以不带括号的
哎,你就不会改下错吗,这个代码你应该是看过很多遍了
using (Transaction Trans = db.TransactionManager.StartTransaction())
发表于 2010-12-6 19:29 | 显示全部楼层
本帖最后由 河伯 于 2010-12-6 19:37 编辑

前面的GetEntity方法使用效果并不好,且隐藏着类型安全问题。
对于过滤子类的选择集,如果返回DBObjectCollection ,还需二次转换。
下面的泛型方法返回数组,实体子类、符号表记录、词典条目都适用。
  1.    Public Shared Function GetObject(Of T)(ByVal Ids() As ObjectId) As T()
  2.         Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  3.         Dim db As Database = doc.Database

  4.         Dim lstObj As New List(Of T)
  5.         Using Trans As Transaction = db.TransactionManager.StartTransaction
  6.             For Each Id As ObjectId In Ids
  7.                 Dim obj As DBObject = Id.GetObject(OpenMode.ForRead)
  8.                 If TypeOf obj Is T Then
  9.                     lstObj.Add(CTypeDynamic(Of T)(obj))
  10.                 End If
  11.             Next
  12.             Trans.Commit()
  13.         End Using
  14.    
  15.         Return IIf(lstObj.Count > 0, lstObj.ToArray, Nothing)
  16.     End Function
发表于 2010-12-6 19:38 | 显示全部楼层
本帖最后由 lzh741206 于 2010-12-6 19:49 编辑

Linq的写法,这样要简洁些,:)
C#:
  1.             ObjectIdCollection ids = new ObjectIdCollection();
  2.             var objs = new DBObjectCollection();
  3.             ids
  4.             .Cast<ObjectId>()
  5.             .ToList()
  6.             .ForEach(id => objs.Add(id.GetObject(OpenMode.ForRead)));
复制代码
VB.Net(写法有点奇怪,不习惯了,呵呵):
  1.         Dim ids As New ObjectIdCollection()
  2.         Dim objs As New DBObjectCollection()
  3.         ids.Cast(Of ObjectId).ToList().ForEach(Function(id As ObjectId) objs.Add(id.GetObject(OpenMode.ForRead)))


 楼主| 发表于 2010-12-6 19:43 | 显示全部楼层
本帖最后由 chpmould 于 2012-3-28 21:26 编辑

我测试的时候一直在新建块的时候就出错,请帮我调试看看...
  1.     [CommandMethod("test")]
  2.     public void CreateCircle()
  3.      {
  4.             Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.             Editor ed = doc.Editor;
  6.             Database db = doc.Database;
  7.             using (doc.LockDocument())
  8.             using (Transaction tr = db.TransactionManager.StartTransaction())
  9.             {
  10.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  11.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  12.                 ObjectId c1 = AddCircle(new Point3d(0, 0, 0), 10);
  13.                 ObjectId c2 = AddCircle(new Point3d(0, 0, 0), 15);
  14.                             ObjectIdCollection cir01 = new ObjectIdCollection();
  15.                 cir01.Add(c1);
  16.                 cir01.Add(c2);
  17.                            DBObjectCollection objs = GetEntity(cir01);
  18.                               CreateBlockDef("Test", objs);
  19.                 tr.Commit();
  20.             }
  21.      }

  22.      public static ObjectId AddCircle(Point3d cenPt, double radius)
  23.     {
  24.         Circle ent = new Circle(cenPt, Vector3d.ZAxis, radius);
  25.         ObjectId entId = AppendEntity(ent);
  26.         return entId;
  27.     }

  28.     public static DBObjectCollection GetEntity(ObjectIdCollection objId)
  29.     {
  30.         Document doc = Application.DocumentManager.MdiActiveDocument;
  31.         Database db = doc.Database;
  32.         DBObjectCollection obj = new DBObjectCollection();
  33.         using (Transaction tr = db.TransactionManager.StartTransaction())
  34.         {
  35.             foreach (ObjectId Id in objId)
  36.             {
  37.                 obj.Add(Id.GetObject(OpenMode.ForRead));
  38.             }
  39.             tr.Commit();
  40.         }
  41.         return obj;   
  42.     }

  43.     public static ObjectId CreateBlockDef(string blockname, DBObjectCollection objs)
  44.     {
  45.         Database db = HostApplicationServices.WorkingDatabase;
  46.         using (Transaction tr = db.TransactionManager.StartTransaction())
  47.         {
  48.             BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite, false);
  49.             if (bt.Has(blockname))
  50.             {
  51.                 return bt[blockname];
  52.             }
  53.             else
  54.             {
  55.                 BlockTableRecord btr = new BlockTableRecord();
  56.                 btr.Name = blockname;
  57.                 ObjectId id = bt.Add(btr);
  58.                 tr.AddNewlyCreatedDBObject(btr, true);
  59.                 foreach (Entity ent in objs)
  60.                 {
  61.                     btr.AppendEntity(ent);
  62.                     tr.AddNewlyCreatedDBObject(ent, true);
  63.                 }
  64.                 tr.Commit();
  65.                 return id;
  66.             }
  67.         }
  68.     }

  69.     public static ObjectId AppendEntity(Entity ent)
  70.     {
  71.         Database db = HostApplicationServices.WorkingDatabase;
  72.         ObjectId entId;
  73.         using (Transaction trans = db.TransactionManager.StartTransaction())
  74.         {
  75.             BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  76.             BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  77.             entId = btr.AppendEntity(ent);
  78.             trans.AddNewlyCreatedDBObject(ent, true);
  79.             trans.Commit();
  80.         }
  81.         return entId;
  82.     }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-13 17:29 , Processed in 0.138580 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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