/***********************************************************************
* FileName: BlockTableClass .CS
* File Created: 2010-4-9 15:26
* Description: 块表类,块表记录,块表引用
* Purpose :
* History:
* Creator : 成吉思汗
********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Client.AutoCad
{
/// <summary>
/// 块表,块表记录
/// </summary>
public class BlockTableClass
{
#region 创建块表和块表记录
/// <summary>
/// 创建块表和块表记录
/// </summary>
/// <param name="btRecordName">块表记录名称</param>
/// <returns>返回块表记录的objectid</returns>
public Autodesk.AutoCAD.DatabaseServices.ObjectId CreateBlockTableAndBlockTableRecord(string btRecordName)
{
//定义函数的返回值ObjectId
Autodesk.AutoCAD.DatabaseServices.ObjectId blkObjId = new Autodesk.AutoCAD.DatabaseServices.ObjectId();
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
using (Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction())
{
try
{
//获取块表
Autodesk.AutoCAD.DatabaseServices.BlockTable bt = (Autodesk.AutoCAD.DatabaseServices.BlockTable)trans.GetObject(db.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
//通过块名myBlkName判断块表中是否包含块表记录
if ((bt.Has(btRecordName)))
{
blkObjId = bt[btRecordName];//如果已经存在,通过块名获取块对应的ObjectId
}
else
{
//起源点坐标
Autodesk.AutoCAD.Geometry.Point3d ptInsert = new Autodesk.AutoCAD.Geometry.Point3d(0, 0, 0);
//创建新的块表记录
Autodesk.AutoCAD.DatabaseServices.BlockTableRecord newBtr = new Autodesk.AutoCAD.DatabaseServices.BlockTableRecord();
newBtr.Name = btRecordName;
newBtr.Origin = ptInsert;
//保存块表记录到块表
blkObjId = bt.Add(newBtr); // 返回块对应的ObjectId
trans.AddNewlyCreatedDBObject(newBtr, true);
}
trans.Commit(); //提交事务
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
//放弃事务
trans.Abort();
}
}
return blkObjId;
}
#endregion
#region 创建块表引用
/// <summary>
/// 创建块表引用
/// </summary>
/// <param name="blockrefName"></param>
/// <param name="blocktablerecordId">块表记录objectId</param>
/// <returns>返回块表引用的objectid</returns>
public Autodesk.AutoCAD.DatabaseServices.ObjectId CreateBlockReference(string blockrefName, Autodesk.AutoCAD.DatabaseServices.ObjectId blocktablerecordId)
{
Autodesk.AutoCAD.Geometry.Point3d ptInsert = new Autodesk.AutoCAD.Geometry.Point3d(10, 10, 0);
//定义函数的返回值ObjectId
Autodesk.AutoCAD.DatabaseServices.ObjectId blkrefObjId = new Autodesk.AutoCAD.DatabaseServices.ObjectId();
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
using (Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction())
{
try
{
//获取块表和模型空间
Autodesk.AutoCAD.DatabaseServices.BlockTable bt = (Autodesk.AutoCAD.DatabaseServices.BlockTable)(trans.GetObject(db.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite));
Autodesk.AutoCAD.DatabaseServices.BlockTableRecord btr = (Autodesk.AutoCAD.DatabaseServices.BlockTableRecord)trans.GetObject(bt[Autodesk.AutoCAD.DatabaseServices.BlockTableRecord.ModelSpace], Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
//创建块引用, 指定插入点和所引用的块表记录
Autodesk.AutoCAD.DatabaseServices.BlockReference blkRef = new Autodesk.AutoCAD.DatabaseServices.BlockReference(ptInsert, blocktablerecordId);
if ((blkRef.Name.Equals(blockrefName)))
{
blkrefObjId = blkRef.ObjectId;//如果已经存在,通过块名获取块对应的ObjectId
}
else
{
blkRef.Rotation = 1;//指定旋转角,按弧度
//保存新创建的块引用到模型空间
btr.AppendEntity(blkRef);
trans.AddNewlyCreatedDBObject(blkRef, true); // 通知事务新创建了对象
blkrefObjId = blkRef.ObjectId;
}
trans.Commit(); //提交事务
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
//放弃事务
trans.Abort();
}
}
return blkrefObjId;
}
#endregion
#region 获取块表objectid
/// <summary>
/// 获取块表objectid
/// </summary>
/// <param name="btName"></param>
/// <returns></returns>
public Autodesk.AutoCAD.DatabaseServices.ObjectId GetBlockTableObjectId(string btName)
{
Autodesk.AutoCAD.DatabaseServices.ObjectId blObjId = new Autodesk.AutoCAD.DatabaseServices.ObjectId();
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
Autodesk.AutoCAD.DatabaseServices.BlockTable bt = (Autodesk.AutoCAD.DatabaseServices.BlockTable)trans.GetObject(db.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
//通过块名myBlkName判断块表中是否包含块表记录
if ((bt.Has(btName)))
{
blObjId = bt[btName];//如果已经存在,通过块名获取块对应的ObjectId
}
trans.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
//放弃事务
trans.Abort();
}
finally
{
trans.Dispose();
}
return blObjId;
}
#endregion
#region 获取块表记录objectid
/// <summary>
/// 获取块表记录objectid
/// </summary>
/// <param name="btName"></param>
/// <returns>获取块表记录objectid</returns>
public Autodesk.AutoCAD.DatabaseServices.ObjectId GetBlockTableRecordObjectId(string btrName)
{
Autodesk.AutoCAD.DatabaseServices.ObjectId btrObjId = new Autodesk.AutoCAD.DatabaseServices.ObjectId();
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
Autodesk.AutoCAD.DatabaseServices.BlockTable bt = (Autodesk.AutoCAD.DatabaseServices.BlockTable)trans.GetObject(db.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
Autodesk.AutoCAD.DatabaseServices.BlockTableRecord btr = (Autodesk.AutoCAD.DatabaseServices.BlockTableRecord)trans.GetObject(bt[Autodesk.AutoCAD.DatabaseServices.BlockTableRecord.ModelSpace], Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
if (btr.Name.Equals(btrName))
btrObjId = btr.ObjectId;
trans.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
//放弃事务
trans.Abort();
}
finally
{
trans.Dispose();
}
return btrObjId;
}
#endregion
#region 获取块表引用objectids
/// <summary>
/// 获取块表引用objectids
/// </summary>
/// <param name="blkRefName">块表引用的名称</param>
/// <returns>获取块表引用retBlockTableRecordObjectIds</returns>
public Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection GetBlockTableRecordObjectCollection(string blkRefName)
{
Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection btrObjIds = new Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection();
Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection retBlockTableRecordObjectIds = new Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection();
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
Autodesk.AutoCAD.DatabaseServices.BlockTable bt = (Autodesk.AutoCAD.DatabaseServices.BlockTable)trans.GetObject(db.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
Autodesk.AutoCAD.DatabaseServices.BlockTableRecord btr = (Autodesk.AutoCAD.DatabaseServices.BlockTableRecord)trans.GetObject(bt[Autodesk.AutoCAD.DatabaseServices.BlockTableRecord.ModelSpace], Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
btrObjIds = btr.GetBlockReferenceIds(true, true);
foreach (Autodesk.AutoCAD.DatabaseServices.ObjectId objId in btrObjIds)
{
Autodesk.AutoCAD.DatabaseServices.BlockReference blkRef = (Autodesk.AutoCAD.DatabaseServices.BlockReference)trans.GetObject(objId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
if (blkRef.Name.Equals(blkRefName))
retBlockTableRecordObjectIds.Add(blkRef.ObjectId);
}
trans.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
//放弃事务
trans.Abort();
}
finally
{
trans.Dispose();
}
return retBlockTableRecordObjectIds;
}
/// <summary>
/// 获取块表引用objectids
/// </summary>
/// <returns>获取块表引用retBlockTableRecordObjectIds</returns>
public Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection GetBlockTableRecordObjectCollection()
{
Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection retBlockTableRecordObjectIds = new Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection();
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
Autodesk.AutoCAD.DatabaseServices.BlockTable bt = (Autodesk.AutoCAD.DatabaseServices.BlockTable)trans.GetObject(db.BlockTableId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
Autodesk.AutoCAD.DatabaseServices.BlockTableRecord btr = (Autodesk.AutoCAD.DatabaseServices.BlockTableRecord)trans.GetObject(bt[Autodesk.AutoCAD.DatabaseServices.BlockTableRecord.ModelSpace], Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
retBlockTableRecordObjectIds = btr.GetBlockReferenceIds(true, true);
trans.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
//放弃事务
trans.Abort();
}
finally
{
trans.Dispose();
}
return retBlockTableRecordObjectIds;
}
/// <summary>
/// 获取块表引用objectids
/// </summary>
/// <param name="blname">块表记录</param>
/// <returns>获取块表引用retBlockTableRecordObjectIds</returns>
public Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection GetBlockTableRecordObjectCollectionByBlockTable(string blname)
{
Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection retBlockTableRecordObjectIds = new Autodesk.AutoCAD.DatabaseServices.ObjectIdCollection();
Autodesk.AutoCAD.DatabaseServices.Database db = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase;
Autodesk.AutoCAD.DatabaseServices.Transaction trans = db.TransactionManager.StartTransaction();
try
{
Autodesk.AutoCAD.DatabaseServices.ObjectId blObjId = GetBlockTableObjectId(blname);
if (null == blObjId || string.IsNullOrEmpty(blObjId.ToString()))
return retBlockTableRecordObjectIds;
Autodesk.AutoCAD.DatabaseServices.BlockTable bt = (Autodesk.AutoCAD.DatabaseServices.BlockTable)trans.GetObject(blObjId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForRead);
Autodesk.AutoCAD.DatabaseServices.BlockTableRecord btr = (Autodesk.AutoCAD.DatabaseServices.BlockTableRecord)trans.GetObject(bt[Autodesk.AutoCAD.DatabaseServices.BlockTableRecord.ModelSpace], Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite);
retBlockTableRecordObjectIds = btr.GetBlockReferenceIds(true, true);
trans.Commit();
}
catch (Autodesk.AutoCAD.Runtime.Exception e)
{
//放弃事务
trans.Abort();
}
finally
{
trans.Dispose();
}
return retBlockTableRecordObjectIds;
}
#endregion
}
}