创建块定义(块表记录)

/***********************************************************************
 * 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
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值