chpmould 发表于 2010-12-5 22:45:00

集合对象的相互转换

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

河伯 发表于 2010-12-5 23:05:00


VB.NET的:   
Public Shared Function GetEntity(ByVal objId As ObjectIdCollection) As DBObjectCollection
      Dim doc As Document = Application.DocumentManager.MdiActiveDocument
      Dim db As Database = doc.Database
      Dim objs As New DBObjectCollection
      Using Trans As Transaction = db.TransactionManager.StartTransaction
            For Each Id As ObjectId In objId
                   obj.Add(Id.GetObject(OpenMode.ForRead))
            Next
            Trans.Commit()
      End Using
      Return obj 'DBObjectCollection
    End Function

河伯 发表于 2010-12-5 23:25:00


转成C#:
public static DBObjectCollection GetEntity(ObjectIdCollection objId)
{
      Document doc = Application.DocumentManager.MdiActiveDocument;
      Database db = doc.Database;
      DBObjectCollection obj = new DBObjectCollection();
      using (Transaction Trans = db.TransactionManager.StartTransaction) {
                foreach (ObjectId Id in objId) {
                     obj.Add(Id.GetObject(OpenMode.ForRead));
                }
                Trans.Commit();
      }
      return obj;      //DBObjectCollection
}

chpmould 发表于 2010-12-6 12:41:00

请教老师: 例如我定义cir01集合,需要如何调用你的这个转换函数...复制代码

雪山飞狐_lzh 发表于 2010-12-6 13:20:00

你的返回值要求是DBObjectCollection,赋值给DBObject 当然会错

chpmould 发表于 2010-12-6 18:42:00


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

雪山飞狐_lzh 发表于 2010-12-6 18:50:00

河伯老兄是VB的写法,方法可以不带括号的
哎,你就不会改下错吗,这个代码你应该是看过很多遍了
using (Transaction Trans = db.TransactionManager.StartTransaction())

河伯 发表于 2010-12-6 19:29:00


前面的GetEntity方法使用效果并不好,且隐藏着类型安全问题。
对于过滤子类的选择集,如果返回DBObjectCollection ,还需二次转换。
下面的泛型方法返回数组,实体子类、符号表记录、词典条目都适用。
   Public Shared Function GetObject(Of T)(ByVal Ids() As ObjectId) As T()
      Dim doc As Document = Application.DocumentManager.MdiActiveDocument
      Dim db As Database = doc.Database
      Dim lstObj As New List(Of T)
      Using Trans As Transaction = db.TransactionManager.StartTransaction
            For Each Id As ObjectId In Ids
                Dim obj As DBObject = Id.GetObject(OpenMode.ForRead)
                If TypeOf obj Is T Then
                  lstObj.Add(CTypeDynamic(Of T)(obj))
                End If
            Next
            Trans.Commit()
      End Using
   
      Return IIf(lstObj.Count > 0, lstObj.ToArray, Nothing)
    End Function

雪山飞狐_lzh 发表于 2010-12-6 19:38:00


Linq的写法,这样要简洁些,:)
C#:
复制代码VB.Net(写法有点奇怪,不习惯了,呵呵):

      Dim ids As New ObjectIdCollection()
      Dim objs As New DBObjectCollection()
      ids.Cast(Of ObjectId).ToList().ForEach(Function(id As ObjectId) objs.Add(id.GetObject(OpenMode.ForRead)))

chpmould 发表于 2010-12-6 19:43:00


我测试的时候一直在新建块的时候就出错,请帮我调试看看...
   
    public void CreateCircle()
   {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            using (doc.LockDocument())
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt, OpenMode.ForWrite);
                ObjectId c1 = AddCircle(new Point3d(0, 0, 0), 10);
                ObjectId c2 = AddCircle(new Point3d(0, 0, 0), 15);
                            ObjectIdCollection cir01 = new ObjectIdCollection();
                cir01.Add(c1);
                cir01.Add(c2);
                           DBObjectCollection objs = GetEntity(cir01);
                              CreateBlockDef("Test", objs);
                tr.Commit();
            }
   }
   public static ObjectId AddCircle(Point3d cenPt, double radius)
    {
      Circle ent = new Circle(cenPt, Vector3d.ZAxis, radius);
      ObjectId entId = AppendEntity(ent);
      return entId;
    }
    public static DBObjectCollection GetEntity(ObjectIdCollection objId)
    {
      Document doc = Application.DocumentManager.MdiActiveDocument;
      Database db = doc.Database;
      DBObjectCollection obj = new DBObjectCollection();
      using (Transaction tr = db.TransactionManager.StartTransaction())
      {
            foreach (ObjectId Id in objId)
            {
                obj.Add(Id.GetObject(OpenMode.ForRead));
            }
            tr.Commit();
      }
      return obj;   
    }
    public static ObjectId CreateBlockDef(string blockname, DBObjectCollection objs)
    {
      Database db = HostApplicationServices.WorkingDatabase;
      using (Transaction tr = db.TransactionManager.StartTransaction())
      {
            BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite, false);
            if (bt.Has(blockname))
            {
                return bt;
            }
            else
            {
                BlockTableRecord btr = new BlockTableRecord();
                btr.Name = blockname;
                ObjectId id = bt.Add(btr);
                tr.AddNewlyCreatedDBObject(btr, true);
                foreach (Entity ent in objs)
                {
                  btr.AppendEntity(ent);
                  tr.AddNewlyCreatedDBObject(ent, true);
                }
                tr.Commit();
                return id;
            }
      }
    }
    public static ObjectId AppendEntity(Entity ent)
    {
      Database db = HostApplicationServices.WorkingDatabase;
      ObjectId entId;
      using (Transaction trans = db.TransactionManager.StartTransaction())
      {
            BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
            BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt, OpenMode.ForWrite);
            entId = btr.AppendEntity(ent);
            trans.AddNewlyCreatedDBObject(ent, true);
            trans.Commit();
      }
      return entId;
    }
页: [1]
查看完整版本: 集合对象的相互转换