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

集合对象的相互转换

本帖最后由 chpmould 于 2010-12-5 22:46 编辑

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

DBObjectCollection obj = new DBObjectCollection();

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

本帖最后由 河伯 于 2010-12-5 23:32 编辑

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:24

本帖最后由 河伯 于 2010-12-5 23:32 编辑

转成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:12

请教老师: 例如我定义cir01集合,需要如何调用你的这个转换函数...ObjectIdCollection cir01 = new ObjectIdCollection();
cir01.Add(line01);
cir01.Add(line02);

// 我这样调用cir01集合转为 obj 对象不对,请帮助指正...
   DBObject DBobj01 = GetEntity(cir01);

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

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

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

本帖最后由 chpmould 于 2010-12-6 18:48 编辑

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

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


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

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

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

本帖最后由 河伯 于 2010-12-6 19:37 编辑

前面的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:22

本帖最后由 lzh741206 于 2010-12-6 19:49 编辑

Linq的写法,这样要简洁些,:)
C#:
            ObjectIdCollection ids = new ObjectIdCollection();
            var objs = new DBObjectCollection();
            ids
            .Cast<ObjectId>()
            .ToList()
            .ForEach(id => objs.Add(id.GetObject(OpenMode.ForRead)));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:17

本帖最后由 chpmould 于 2012-3-28 21:26 编辑

我测试的时候一直在新建块的时候就出错,请帮我调试看看...    
    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] 2 3
查看完整版本: 集合对象的相互转换