乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 132|回复: 9

集合对象的相互转换

[复制链接]

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-5 22:45:00 | 显示全部楼层 |阅读模式
请教老师:不知能否实现将以下 objId 集合转为 obj 对象
ObjectIdCollection objId = new ObjectIdCollection();
DBObjectCollection obj = new DBObjectCollection();
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2010-12-5 23:05:00 | 显示全部楼层

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
回复

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2010-12-5 23:25:00 | 显示全部楼层

转成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. }
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-6 12:41:00 | 显示全部楼层
请教老师: 例如我定义cir01集合,需要如何调用你的这个转换函数...复制代码
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-12-6 13:20:00 | 显示全部楼层
你的返回值要求是DBObjectCollection,赋值给DBObject 当然会错
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-6 18:42:00 | 显示全部楼层

我现改为:  DBObjectCollection  DBobj01 = GetEntity(cir01);之后还调不成功,一直提示如下信息,请问我错在那里了?
出错提 示信息: 无法将方法组 “ StartTransaction ” 转换为非委托类型 “ Autodesk.AutoCAD.DatabaseServices.Transaction ”。你是要调用方法吗?
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

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

使用道具 举报

13

主题

84

帖子

6

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2010-12-6 19:29:00 | 显示全部楼层

前面的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
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2010-12-6 19:38:00 | 显示全部楼层

Linq的写法,这样要简洁些,:)
C#:
复制代码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)))
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2010-12-6 19:43:00 | 显示全部楼层

我测试的时候一直在新建块的时候就出错,请帮我调试看看...
  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.     }
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-15 17:36 , Processed in 0.348739 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表