集合对象的相互转换
本帖最后由 chpmould 于 2010-12-5 22:46 编辑请教老师:不知能否实现将以下 objId 集合转为 obj 对象
ObjectIdCollection objId = new ObjectIdCollection();
DBObjectCollection obj = new DBObjectCollection();
本帖最后由 河伯 于 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: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
}
请教老师: 例如我定义cir01集合,需要如何调用你的这个转换函数...ObjectIdCollection cir01 = new ObjectIdCollection();
cir01.Add(line01);
cir01.Add(line02);
// 我这样调用cir01集合转为 obj 对象不对,请帮助指正...
DBObject DBobj01 = GetEntity(cir01); 你的返回值要求是DBObjectCollection,赋值给DBObject 当然会错 本帖最后由 chpmould 于 2010-12-6 18:48 编辑
我现改为:DBObjectCollectionDBobj01 = GetEntity(cir01);之后还调不成功,一直提示如下信息,请问我错在那里了?
出错提 示信息: 无法将方法组 “ StartTransaction ” 转换为非委托类型 “ Autodesk.AutoCAD.DatabaseServices.Transaction ”。你是要调用方法吗?
河伯老兄是VB的写法,方法可以不带括号的
哎,你就不会改下错吗,这个代码你应该是看过很多遍了
using (Transaction Trans = db.TransactionManager.StartTransaction())
本帖最后由 河伯 于 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 本帖最后由 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 于 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;
}