C#讀取Excel數據在CAD上展圖

本實例包含以下技術要點:

1.如何用代碼創建帶屬性的塊對象,而非導入外部圖塊文件(尤其是帶填充對象的圖塊).

2.如何更改塊屬性的屬性值.

3.如何創建文本樣式.

4.如何讀取Excel文件當中的數據.


Excel文件的數據格式:

JKC1 靜力觸探孔 3045304.377  543717.354  2.630  32.500 
JKC2 靜力觸探孔 3045617.146  545348.081  3.200  35.800 
JKC3 靜力觸探孔 3046038.390  546159.911  3.380  35.500 
SKC1 十字板 3045617.739  545346.739  3.200  30.000 
SKC2 十字板 3046138.556  548510.327  2.520  30.000 
SKC3 十字板 3046605.847  555424.066  2.200  30.000 
ZKC1 取土樣鑽孔 3045384.183  544032.220  2.680  80.000 
ZKC2 取土樣鑽孔 3045436.779  544468.844  2.720  76.100 
ZKC3 取土樣鑽孔 3045477.244  544827.897  2.680  80.500 


創建圖塊的源碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

namespace ReaderExcelDrawMapII
{
    /// <summary>
    /// 創建圖塊
    /// </summary>
    public class CreateBlock
    {
        /// <summary>
        /// 創建JK圖塊
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId createBlockJK()
        {
            ObjectId blockId = new ObjectId();
            Database db = HostApplicationServices.WorkingDatabase;
            //得到當前文檔圖形數據庫
            BlockTableRecord record = new BlockTableRecord();

            //圖塊名稱
            record.Name = "JK";
            record.Origin = new Point3d(0, 0, 0);

            //打開事務
            using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
            {

                //創建第一個多段線對象
                Point2dCollection pts1 = new Point2dCollection();
                pts1.Add(new Point2d(-3.8, 0.0));
                pts1.Add(new Point2d(+3.8, 0.0));

                Polyline pline1 = new Polyline();
                for (int i = 0; i <= pts1.Count - 1; i++)
                {
                    pline1.AddVertexAt(i, pts1[i], 1, 0.4, 0.4);
                }
                pline1.Closed = true;
                pline1.Layer = "0";
                pline1.ColorIndex = 0;
                record.AppendEntity(pline1);

                //創建第一個多段線對象
                Point2dCollection pts2 = new Point2dCollection();
                pts2.Add(new Point2d(0.0, -3.8));
                pts2.Add(new Point2d(3.2909, 1.9));
                pts2.Add(new Point2d(-3.2909, 1.9));

                Polyline pline2 = new Polyline();
                for (int i = 0; i <= pts2.Count - 1; i++)
                {
                    pline2.AddVertexAt(i, pts2[i], 0, 0.2, 0.2);
                }
                pline2.Closed = true;
                pline2.Layer = "0";
                pline2.ColorIndex = 0;
                record.AppendEntity(pline2);

                //創建第一個多段線對象
                Point2dCollection pts3 = new Point2dCollection();
                pts3.Add(new Point2d(0.0, 4.0));
                pts3.Add(new Point2d(0.0, 14.0));
                pts3.Add(new Point2d(28.0, 14.0));

                Polyline pline3 = new Polyline();
                for (int i = 0; i <= pts3.Count - 1; i++)
                {
                    pline3.AddVertexAt(i, pts3[i], 0, 0.2, 0.2);
                }
                pline3.Layer = "0";
                pline3.ColorIndex = 0;
                record.AppendEntity(pline3);

                AttributeDefinition att1 = new AttributeDefinition();
                att1.Position = new Point3d(13.6683, 18.8785, 0.0);
                att1.Height = 7.8;
                //設置文字高度
                att1.WidthFactor = 0.7;
                //設置寬度因子
                att1.HorizontalMode = TextHorizontalMode.TextMid;
                //設置水平對齊方式
                att1.VerticalMode = TextVerticalMode.TextVerticalMid;
                //設置垂直對齊方式
                att1.AlignmentPoint = att1.Position;
                att1.Prompt = "孔號";
                //設置屬性提示
                att1.TextString = "JKS1";
                //設置屬性的缺省值
                att1.Tag = "孔號";
                //設置屬性標籤
                att1.Layer = "0";
                att1.TextStyleId = CreateEntity.CreateStyle();
                //指定文本樣式
                att1.ColorIndex = 0;
                record.AppendEntity(att1);


                AttributeDefinition att2 = new AttributeDefinition();
                att2.Position = new Point3d(13.6683, 8.3528, 0.0);
                att2.Height = 7.8;
                //設置文字高度
                att2.WidthFactor = 0.7;
                //設置寬度因子
                att2.HorizontalMode = TextHorizontalMode.TextMid;
                //設置水平對齊方式
                att2.VerticalMode = TextVerticalMode.TextVerticalMid;
                //設置垂直對齊方式
                att2.AlignmentPoint = att2.Position;
                att2.Prompt = "孔深";
                //設置屬性提示
                att2.TextString = "0.00";
                //設置屬性的缺省值
                att2.Tag = "孔深";
                //設置屬性標籤
                att2.Layer = "0";
                att2.TextStyleId = CreateEntity.CreateStyle();
                //指定文本樣式
                att2.ColorIndex = 0;
                record.AppendEntity(att2);

                //以寫的方式打開塊表
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;

                //判斷圖塊是否存在
                if (bt.Has(record.Name) == false)
                {
                    //在塊表中加入塊
                    blockId = bt.Add(record);
                    //通知事務處理
                    trans.AddNewlyCreatedDBObject(record, true);
                    //提交事務
                    trans.Commit();
                }
            }

            return blockId;
        }

        /// <summary>
        /// 創建MK圖塊
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId createBlockMK()
        {
            ObjectId blockId = new ObjectId();
            Database db = HostApplicationServices.WorkingDatabase;
            //得到當前文檔圖形數據庫
            BlockTableRecord record = new BlockTableRecord();

            //圖塊名稱
            record.Name = "MK";
            record.Origin = new Point3d(0, 0, 0);

            //打開事務
            using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
            {

                //創建第一個多段線對象
                Point2dCollection pts1 = new Point2dCollection();
                pts1.Add(new Point2d(-3.8, 0.0));
                pts1.Add(new Point2d(+3.8, 0.0));

                Polyline pline1 = new Polyline();
                for (int i = 0; i <= pts1.Count - 1; i++)
                {
                    pline1.AddVertexAt(i, pts1[i], 1, 0.4, 0.4);
                }
                pline1.Closed = true;
                pline1.Layer = "0";
                pline1.ColorIndex = 0;
                record.AppendEntity(pline1);

                //創建第一個多段線對象
                Point2dCollection pts2 = new Point2dCollection();
                pts2.Add(new Point2d(0.0, 4.0));
                pts2.Add(new Point2d(0.0, 14.0));
                pts2.Add(new Point2d(28.0, 14.0));

                Polyline pline2 = new Polyline();
                for (int i = 0; i <= pts2.Count - 1; i++)
                {
                    pline2.AddVertexAt(i, pts2[i], 0, 0.2, 0.2);
                }
                pline2.Layer = "0";
                pline2.ColorIndex = 0;
                record.AppendEntity(pline2);

                AttributeDefinition att1 = new AttributeDefinition();
                att1.Position = new Point3d(13.6683, 18.8785, 0.0);
                att1.Height = 7.8;
                //設置文字高度
                att1.WidthFactor = 0.7;
                //設置寬度因子
                att1.HorizontalMode = TextHorizontalMode.TextMid;
                //設置水平對齊方式
                att1.VerticalMode = TextVerticalMode.TextVerticalMid;
                //設置垂直對齊方式
                att1.AlignmentPoint = att1.Position;
                att1.Prompt = "孔號";
                //設置屬性提示
                att1.TextString = "MK1";
                //設置屬性的缺省值
                att1.Tag = "孔號";
                //設置屬性標籤
                att1.Layer = "0";
                att1.TextStyleId = CreateEntity.CreateStyle();
                //指定文本樣式
                att1.ColorIndex = 0;
                record.AppendEntity(att1);

                AttributeDefinition att2 = new AttributeDefinition();
                att2.Position = new Point3d(13.6683, 8.3528, 0.0);
                att2.Height = 7.8;
                //設置文字高度
                att2.WidthFactor = 0.7;
                //設置寬度因子
                att2.HorizontalMode = TextHorizontalMode.TextMid;
                //設置水平對齊方式
                att2.VerticalMode = TextVerticalMode.TextVerticalMid;
                //設置垂直對齊方式
                att2.AlignmentPoint = att2.Position;
                att2.Prompt = "孔深";
                //設置屬性提示
                att2.TextString = "0.00";
                //設置屬性的缺省值
                att2.Tag = "孔深";
                //設置屬性標籤
                att2.Layer = "0";
                att2.TextStyleId = CreateEntity.CreateStyle();
                //指定文本樣式
                att2.ColorIndex = 0;
                record.AppendEntity(att2);

                //以寫的方式打開塊表
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;

                //判斷圖塊是否存在
                if (bt.Has(record.Name) == false)
                {
                    //在塊表中加入塊
                    blockId = bt.Add(record);
                    //通知事務處理
                    trans.AddNewlyCreatedDBObject(record, true);
                    //提交事務
                    trans.Commit();
                }
            }

            return blockId;
        }

        /// <summary>
        /// 創建SZB圖塊
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId createBlockSZB()
        {
            ObjectId blockId = new ObjectId();
            Database db = HostApplicationServices.WorkingDatabase;
            //得到當前文檔圖形數據庫
            BlockTableRecord record = new BlockTableRecord();

            //圖塊名稱
            record.Name = "SZB";
            record.Origin = new Point3d(0, 0, 0);

            //打開事務
            using (Transaction trans = db.TransactionManager.StartOpenCloseTransaction())
            {

                //創建第一個多段線對象
                Point2dCollection pts1 = new Point2dCollection();
                pts1.Add(new Point2d(-3.8, 0.0));
                pts1.Add(new Point2d(+3.8, 0.0));

                Polyline pline1 = new Polyline();
                for (int i = 0; i <= pts1.Count - 1; i++)
                {
                    pline1.AddVertexAt(i, pts1[i], 1, 0.4, 0.4);
                }
                pline1.Closed = true;
                pline1.Layer = "0";
                pline1.ColorIndex = 0;
                record.AppendEntity(pline1);

                //創建第一個多段線對象
                Polyline pline2 = new Polyline();
                pline2.AddVertexAt(0, new Point2d(-3.8, 0.0), 0, 0.2, 0.2);
                pline2.AddVertexAt(1, new Point2d(+3.8, 0.0), 0, 0.2, 0.2);
                pline2.Layer = "0";
                pline2.ColorIndex = 0;
                record.AppendEntity(pline2);

                //創建第一個多段線對象
                Polyline pline3 = new Polyline();
                pline3.AddVertexAt(0, new Point2d(0.0, +3.8), 0, 0.2, 0.2);
                pline3.AddVertexAt(1, new Point2d(0.0, -3.8), 0, 0.2, 0.2);
                pline3.Layer = "0";
                pline3.ColorIndex = 0;
                record.AppendEntity(pline3);

                //創建第一個多段線對象
                Point2dCollection pts4 = new Point2dCollection();
                pts4.Add(new Point2d(0.0, 4.0));
                pts4.Add(new Point2d(0.0, 14.0));
                pts4.Add(new Point2d(28.0, 14.0));

                Polyline pline4 = new Polyline();
                for (int i = 0; i <= pts4.Count - 1; i++)
                {
                    pline4.AddVertexAt(i, pts4[i], 0, 0.2, 0.2);
                }
                pline4.Layer = "0";
                pline4.ColorIndex = 0;
                record.AppendEntity(pline4);

                AttributeDefinition att1 = new AttributeDefinition();
                att1.Position = new Point3d(13.6683, 18.8785, 0.0);
                att1.Height = 7.8;
                //設置文字高度
                att1.WidthFactor = 0.7;
                //設置寬度因子
                att1.HorizontalMode = TextHorizontalMode.TextMid;
                //設置水平對齊方式
                att1.VerticalMode = TextVerticalMode.TextVerticalMid;
                //設置垂直對齊方式
                att1.AlignmentPoint = att1.Position;
                att1.Prompt = "孔號";
                //設置屬性提示
                att1.TextString = "SKS1";
                //設置屬性的缺省值
                att1.Tag = "孔號";
                //設置屬性標籤
                att1.Layer = "0";
                att1.TextStyleId = CreateEntity.CreateStyle();
                //指定文本樣式
                att1.ColorIndex = 0;
                record.AppendEntity(att1);

                AttributeDefinition att2 = new AttributeDefinition();
                att2.Position = new Point3d(13.6683, 8.3528, 0.0);
                att2.Height = 7.8;
                //設置文字高度
                att2.WidthFactor = 0.7;
                //設置寬度因子
                att2.HorizontalMode = TextHorizontalMode.TextMid;
                //設置水平對齊方式
                att2.VerticalMode = TextVerticalMode.TextVerticalMid;
                //設置垂直對齊方式
                att2.AlignmentPoint = att2.Position;
                att2.Prompt = "孔深";
                //設置屬性提示
                att2.TextString = "0.00";
                //設置屬性的缺省值
                att2.Tag = "孔深";
                //設置屬性標籤
                att2.Layer = "0";
                att2.TextStyleId = CreateEntity.CreateStyle();
                //指定文本樣式
                att2.ColorIndex = 0;
                record.AppendEntity(att2);

                //以寫的方式打開塊表
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;

                //判斷圖塊是否存在
                if (bt.Has(record.Name) == false)
                {
                    //在塊表中加入塊
                    blockId = bt.Add(record);
                    //通知事務處理
                    trans.AddNewlyCreatedDBObject(record, true);
                    //提交事務
                    trans.Commit();
                }
            }

            return blockId;
        }

        /// <summary>
        /// 創建TC圖塊
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId createBlockTC()
        {
            ObjectId blockId = new ObjectId();
            Database db = HostApplicationServices.WorkingDatabase;
            //得到當前文檔圖形數據庫

            //打開事務
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {

                //以寫的方式打開塊表
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;

                //判斷圖塊是否存在
                if (bt.Has("TC") == false)
                {

                    Hatch MyHatch = new Hatch();
                    MyHatch.SetDatabaseDefaults();
                    MyHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");

                    BlockTableRecord record = new BlockTableRecord();

                    //圖塊名稱
                    record.Name = "TC";
                    record.Origin = new Point3d(0, 0, 0);

                    //在塊表中加入塊
                    blockId = bt.Add(record);
                    trans.AddNewlyCreatedDBObject(record, true);

                    //創建第一個多段線對象
                    Point2dCollection pts1 = new Point2dCollection();
                    pts1.Add(new Point2d(-6.346, +2.866));
                    pts1.Add(new Point2d(+6.346, +2.866));
                    pts1.Add(new Point2d(+6.346, -2.866));
                    pts1.Add(new Point2d(-6.346, -2.866));

                    Polyline pline1 = new Polyline();
                    for (int i = 0; i <= pts1.Count - 1; i++)
                    {
                        pline1.AddVertexAt(i, pts1[i], 0, 0.4, 0.4);
                    }
                    pline1.Closed = true;
                    pline1.Layer = "0";
                    pline1.ColorIndex = 0;
                    record.AppendEntity(pline1);

                    //創建第一個多段線對象
                    Point2dCollection pts2 = new Point2dCollection();
                    pts2.Add(new Point2d(0.0, 2.866));
                    pts2.Add(new Point2d(0.0, 12.866));
                    pts2.Add(new Point2d(28.0, 12.866));

                    Polyline pline2 = new Polyline();
                    for (int i = 0; i <= pts2.Count - 1; i++)
                    {
                        pline2.AddVertexAt(i, pts2[i], 0, 0.2, 0.2);
                    }
                    pline2.Closed = true;
                    pline2.Layer = "0";
                    pline2.ColorIndex = 0;
                    record.AppendEntity(pline2);

                    //創建第一個多段線對象
                    Point2dCollection pts3 = new Point2dCollection();
                    pts3.Add(new Point2d(+6.346, +2.866));
                    pts3.Add(new Point2d(+6.346, -2.866));
                    pts3.Add(new Point2d(-6.346, -2.866));

                    Polyline pline3 = new Polyline();
                    for (int i = 0; i <= pts3.Count - 1; i++)
                    {
                        pline3.AddVertexAt(i, pts3[i], 0, 0, 0);
                    }
                    pline3.Closed = true;
                    pline3.Layer = "0";
                    pline3.ColorIndex = 0;
                    pline3.Closed = true;

                    ObjectId objId = record.AppendEntity(pline3);
                    record.AppendEntity(MyHatch);

                    AttributeDefinition att1 = new AttributeDefinition();
                    att1.Position = new Point3d(13.6683, 18.8785, 0.0);
                    att1.Height = 7.8;
                    //設置文字高度
                    att1.WidthFactor = 0.7;
                    //設置寬度因子
                    att1.HorizontalMode = TextHorizontalMode.TextMid;
                    //設置水平對齊方式
                    att1.VerticalMode = TextVerticalMode.TextVerticalMid;
                    //設置垂直對齊方式
                    att1.AlignmentPoint = att1.Position;
                    att1.Prompt = "孔號";
                    //設置屬性提示
                    att1.TextString = "TS1";
                    //設置屬性的缺省值
                    att1.Tag = "孔號";
                    //設置屬性標籤
                    att1.Layer = "0";
                    att1.TextStyleId = CreateEntity.CreateStyle();
                    //指定文本樣式
                    att1.ColorIndex = 0;
                    record.AppendEntity(att1);

                    AttributeDefinition att2 = new AttributeDefinition();
                    att2.Position = new Point3d(13.6683, 8.3528, 0.0);
                    att2.Height = 7.8;
                    //設置文字高度
                    att2.WidthFactor = 0.7;
                    //設置寬度因子
                    att2.HorizontalMode = TextHorizontalMode.TextMid;
                    //設置水平對齊方式
                    att2.VerticalMode = TextVerticalMode.TextVerticalMid;
                    //設置垂直對齊方式
                    att2.AlignmentPoint = att2.Position;
                    att2.Prompt = "孔深";
                    //設置屬性提示
                    att2.TextString = "0.00";
                    //設置屬性的缺省值
                    att2.Tag = "孔深";
                    //設置屬性標籤
                    att2.Layer = "0";
                    att2.TextStyleId = CreateEntity.CreateStyle();
                    //指定文本樣式
                    att2.ColorIndex = 0;
                    record.AppendEntity(att2);

                    //通知事務處理
                    trans.AddNewlyCreatedDBObject(pline1, true);
                    trans.AddNewlyCreatedDBObject(pline2, true);
                    trans.AddNewlyCreatedDBObject(pline3, true);
                    trans.AddNewlyCreatedDBObject(att1, true);
                    trans.AddNewlyCreatedDBObject(att2, true);
                    trans.AddNewlyCreatedDBObject(MyHatch, true);

                    ObjectIdCollection Ids = new ObjectIdCollection();
                    Ids.Add(objId);
                    MyHatch.Associative = true;
                    MyHatch.AppendLoop(HatchLoopTypes.Default, Ids);
                    MyHatch.EvaluateHatch(true);
                    MyHatch.Layer = "0";
                    MyHatch.ColorIndex = 0;

                    //提交事務
                    trans.Commit();
                }
            }
            return blockId;
        }

        /// <summary>
        /// 創建ZK圖塊
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
        public static ObjectId createBlockZK()
        {
            ObjectId blockId = new ObjectId();
            Database db = HostApplicationServices.WorkingDatabase;
            //得到當前文檔圖形數據庫

            //打開事務
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                //以寫的方式打開塊表
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;

                //判斷圖塊是否存在
                if (bt.Has("ZK") == false)
                {

                    Hatch MyHatch = new Hatch();
                    MyHatch.SetDatabaseDefaults();
                    MyHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");

                    BlockTableRecord record = new BlockTableRecord();

                    //圖塊名稱
                    record.Name = "ZK";
                    record.Origin = new Point3d(0, 0, 0);

                    //在塊表中加入塊
                    blockId = bt.Add(record);
                    trans.AddNewlyCreatedDBObject(record, true);

                    //創建第一個多段線對象
                    Point2dCollection pts1 = new Point2dCollection();
                    pts1.Add(new Point2d(-3.8, 0.0));
                    pts1.Add(new Point2d(+3.8, 0.0));

                    Polyline pline1 = new Polyline();
                    for (int i = 0; i <= pts1.Count - 1; i++)
                    {
                        pline1.AddVertexAt(i, pts1[i], 1, 0.4, 0.4);
                    }
                    pline1.Closed = true;
                    pline1.Layer = "0";
                    pline1.ColorIndex = 0;
                    record.AppendEntity(pline1);

                    //創建第一個多段線對象
                    Point2dCollection pts2 = new Point2dCollection();
                    pts2.Add(new Point2d(0.0, 3.8));
                    pts2.Add(new Point2d(0.0, 14.0));
                    pts2.Add(new Point2d(28.0, 14.0));

                    Polyline pline2 = new Polyline();
                    for (int i = 0; i <= pts2.Count - 1; i++)
                    {
                        pline2.AddVertexAt(i, pts2[i], 0, 0.2, 0.2);
                    }
                    pline2.Layer = "0";
                    pline2.ColorIndex = 0;
                    record.AppendEntity(pline2);

                    //創建第一個多段線對象
                    Polyline pline3 = new Polyline();
                    pline3.AddVertexAt(0, new Point2d(0.0, -3.8), 1, 0, 0);
                    pline3.AddVertexAt(1, new Point2d(0.0, +3.8), 0, 0, 0);
                    pline3.Layer = "0";
                    pline3.ColorIndex = 0;
                    pline3.Closed = true;

                    ObjectId objId = record.AppendEntity(pline3);
                    record.AppendEntity(MyHatch);

                    AttributeDefinition att1 = new AttributeDefinition();
                    att1.Position = new Point3d(13.668, 18.878, 0.0);
                    att1.Height = 7.8;
                    //設置文字高度
                    att1.WidthFactor = 0.7;
                    //設置寬度因子
                    att1.HorizontalMode = TextHorizontalMode.TextMid;
                    //設置水平對齊方式
                    att1.VerticalMode = TextVerticalMode.TextVerticalMid;
                    //設置垂直對齊方式
                    att1.AlignmentPoint = att1.Position;
                    att1.Prompt = "孔號";
                    //設置屬性提示
                    att1.TextString = "ZKS1";
                    //設置屬性的缺省值
                    att1.Tag = "孔號";
                    //設置屬性標籤
                    att1.Layer = "0";
                    att1.TextStyleId = CreateEntity.CreateStyle();
                    //指定文本樣式
                    att1.ColorIndex = 0;
                    record.AppendEntity(att1);

                    AttributeDefinition att2 = new AttributeDefinition();
                    att2.Position = new Point3d(13.668, 8.649, 0.0);
                    att2.Height = 7.8;
                    //設置文字高度
                    att2.WidthFactor = 0.7;
                    //設置寬度因子
                    att2.HorizontalMode = TextHorizontalMode.TextMid;
                    //設置水平對齊方式
                    att2.VerticalMode = TextVerticalMode.TextVerticalMid;
                    //設置垂直對齊方式
                    att2.AlignmentPoint = att2.Position;
                    att2.Prompt = "孔深";
                    //設置屬性提示
                    att2.TextString = "0.00";
                    //設置屬性的缺省值
                    att2.Tag = "孔深";
                    //設置屬性標籤
                    att2.Layer = "0";
                    att2.TextStyleId = CreateEntity.CreateStyle();
                    //指定文本樣式
                    att2.ColorIndex = 0;
                    record.AppendEntity(att2);

                    //通知事務處理
                    trans.AddNewlyCreatedDBObject(pline1, true);
                    trans.AddNewlyCreatedDBObject(pline2, true);
                    trans.AddNewlyCreatedDBObject(pline3, true);
                    trans.AddNewlyCreatedDBObject(att1, true);
                    trans.AddNewlyCreatedDBObject(att2, true);
                    trans.AddNewlyCreatedDBObject(MyHatch, true);

                    ObjectIdCollection Ids = new ObjectIdCollection();
                    Ids.Add(objId);
                    MyHatch.Associative = true;
                    MyHatch.AppendLoop(HatchLoopTypes.Default, Ids);
                    MyHatch.EvaluateHatch(true);
                    MyHatch.Layer = "0";
                    MyHatch.ColorIndex = 0;

                    //提交事務
                    trans.Commit();
                }
            }

            return blockId;
        }

    }
}


創建實體源碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.DatabaseServices;

namespace ReaderExcelDrawMapII
{
    /// <summary>
    /// 創建實體對象
    /// </summary>
    public class CreateEntity
    {
        /// <summary>
        /// 插入一個帶屬性的塊
        /// </summary>
        /// <param name="blockName">圖塊名稱</param>
        /// <param name="point">插入點</param>
        /// <param name="scale">圖塊比例</param>
        /// <param name="rotateAngle">圖塊旋轉角度</param>
        /// <param name="KHstring">屬性值:孔號</param>
        /// <param name="KSdouble">屬性值:孔深</param>
        /// <remarks></remarks>
        public void InsertBlockRefWithAtt(string blockName, Point3d point, Scale3d scale, double rotateAngle, string KHstring, double KSdouble)
        {
            Database db = HostApplicationServices.WorkingDatabase;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                if (!bt.Has(blockName))
                {
                    return;
                }
                BlockTableRecord blockwithatt = (BlockTableRecord)trans.GetObject(bt[blockName], OpenMode.ForRead);
                BlockReference blockRef = new BlockReference(point, bt[blockName]);
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                blockRef.ScaleFactors = scale;
                blockRef.Rotation = rotateAngle;
                btr.AppendEntity(blockRef);
                trans.AddNewlyCreatedDBObject(blockRef, true);
                //獲取blockName塊的遍歷器,以實現對塊中對象的訪問
                BlockTableRecordEnumerator iterator = blockwithatt.GetEnumerator();
                //如果blockName塊包含屬性
                if (blockwithatt.HasAttributeDefinitions)
                {
                    //利用塊遍歷器對塊中的對象進行遍歷
                    while (iterator.MoveNext())
                    {
                        //獲取塊遍歷器當前指向的塊中的對象
                        AttributeDefinition attdef = trans.GetObject(iterator.Current, OpenMode.ForRead) as AttributeDefinition;
                        //定義一個新的屬性參照對象
                        AttributeReference att = new AttributeReference();
                        //判斷塊遍歷器當前指向的塊中的對象是否爲屬性定義
                        if (attdef != null)
                        {
                            //從屬性定義對象中繼承相關的屬性到屬性參照對象中
                            att.SetAttributeFromBlock(attdef, blockRef.BlockTransform);
                            //設置屬性參照對象的位置爲屬性定義的位置+塊參照的位置
                            att.Position = attdef.Position + blockRef.Position.GetAsVector();
                            //判斷屬性定義的名稱
                            switch (attdef.Tag)
                            {
                                //設置塊參照的屬性值
                                case "孔號":
                                    att.TextString = KHstring;
                                    break;
                                case "孔深":
                                    att.TextString = KSdouble.ToString();
                                    break;
                            }

                            //判斷塊參照是否可寫,如不可寫,則切換爲可寫狀態
                            if (!blockRef.IsWriteEnabled)
                            {
                                blockRef.UpgradeOpen();
                            }
                            //添加新創建的屬性參照
                            blockRef.AttributeCollection.AppendAttribute(att);
                            //通知事務處理添加新創建的屬性參照
                            trans.AddNewlyCreatedDBObject(att, true);
                        }
                    }
                }
                trans.Commit();//提交事務處理
            }
        }

        /// <summary>
        /// 創建文本樣式
        /// </summary>
        public static ObjectId CreateStyle()
        {
            ObjectId TextstyleId = new ObjectId();
            Database db = HostApplicationServices.WorkingDatabase;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                TextStyleTable st = (TextStyleTable)trans.GetObject(db.TextStyleTableId, OpenMode.ForWrite);
                String StyleName = "hzhz";
                if (st.Has(StyleName) == false)
                {
                    TextStyleTableRecord str = new TextStyleTableRecord();
                    str.Name = StyleName;

                    // 設置TrueType字體(黑體)
                    str.FileName = "SIMHEI.TTF";
                    //---------------------------------------------
                    // 設置SHX字體
                    // str.FileName = "gbenor"
                    //設置大字體.
                    // str.BigFontFileName = "gbcbig"
                    // --------------------------------------------
                    str.ObliquingAngle = 15 * Math.PI / 180;
                    str.XScale = 0.67;
                    TextstyleId = st.Add(str);
                    trans.AddNewlyCreatedDBObject(str, true);
                    db.Textstyle = TextstyleId;
                    trans.Commit();
                }
            }
            return TextstyleId;
        }
    }
}


我在工程項目添加了一個窗體及一個按鈕,按鈕的單擊事件代碼如下:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Autodesk.AutoCAD.DatabaseServices;
using System.Data.OleDb;
using Autodesk.AutoCAD.Geometry;
using System.Text.RegularExpressions;

namespace ReaderExcelDrawMapII
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.openFileDialog1.Title = "打開展點文件";
            this.openFileDialog1.Filter = "Excle 文件(*.xls)|*xls";
            this.openFileDialog1.FileName = "";
            if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string PathString = this.openFileDialog1.FileName;
                string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + PathString + ";" + "Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";
                string strExcel = "select * from [sheet1$]";

                OleDbConnection conn = new OleDbConnection();
                try
                {
                    conn = new OleDbConnection(strConn);
                    conn.Open();
                    OleDbCommand cmd = new OleDbCommand(strExcel, conn);
                    OleDbDataReader read = cmd.ExecuteReader();

                    //得到當前文檔圖形數據庫.
                    Database db = HostApplicationServices.WorkingDatabase;
                    //圖形文檔加鎖
                    using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
                    {

                        //創建圖塊
                        CreateBlock.createBlockJK();
                        CreateBlock.createBlockMK();
                        CreateBlock.createBlockTC();
                        CreateBlock.createBlockZK();
                        CreateBlock.createBlockSZB();

                        using (Transaction trans = db.TransactionManager.StartTransaction())
                        {

                            //以讀方式打開塊表.
                            BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                            //以寫方式打開模型空間塊表記錄.
                            BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;

                            while (read.Read())
                            {

                                //獲取座標值
                                string strX = read.GetValue(2).ToString();
                                string strY = read.GetValue(3).ToString();
                                string strZ = read.GetValue(4).ToString();

                                if (lzxIsNumber(strX) & lzxIsNumber(strY) & lzxIsNumber(strZ))
                                {
                                    Point3d pt = new Point3d(Convert.ToDouble(strX), Convert.ToDouble(strY), Convert.ToDouble(strZ));
                                    string strBlockName = null;
                                    switch (read.GetString(1))
                                    {
                                        case "靜力觸探孔":
                                        case "靜力觸探":
                                        case "靜探":
                                            strBlockName = "JK";
                                            break;
                                        case "十字板孔":
                                        case "十字板試驗孔":
                                        case "十字板":
                                            strBlockName = "SZB";
                                            break;
                                        case "槽探":
                                        case "探槽":
                                            strBlockName = "TC";
                                            break;
                                        case "麻花鑽":
                                        case "麻花鑽孔":
                                        case "螺紋鑽":
                                        case "螺紋鑽孔":
                                            strBlockName = "MK";
                                            break;
                                        default:
                                            strBlockName = "ZK";
                                            break;
                                    }

                                    //獲取深度值
                                    double douSD = 0;
                                    string strSD = read.GetValue(5).ToString();
                                    if (lzxIsNumber(strSD))
                                    {
                                        douSD = Convert.ToDouble(strSD);
                                    }
                                    else
                                    {
                                        douSD = 0.0;
                                    }
                                    CreateEntity createEntity = new CreateEntity();
                                    createEntity.InsertBlockRefWithAtt(strBlockName, pt, new Scale3d(1), 0, read.GetString(0), douSD);
                                }
                            }
                            trans.Commit();
                        }
                    }
                }
                catch
                {

                }
                conn.Close();
                this.Close();
            }
        }

        /// <summary>
        /// 判斷一個string是否可以爲數字
        /// </summary>
        /// <param name="strNumber">數字的字符串</param>
        /// <returns>是否爲數字</returns>
        public bool lzxIsNumber(String strNumber)
        {
            if (!string.IsNullOrEmpty(strNumber))
            {
                if (strNumber.Trim().Length == 0)
                {
                    return false;
                }
                Regex objNotNumberPattern = new Regex("[^0-9.-]");
                Regex objTwoDotPattern = new Regex("[0-9]*[.][0-9]*[.][0-9]*");
                Regex objTwoMinusPattern = new Regex("[0-9]*[-][0-9]*[-][0-9]*");
                String strValidRealPattern = "^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$";
                String strValidIntegerPattern = "^([-]|[0-9])[0-9]*$";
                Regex objNumberPattern = new Regex("(" + strValidRealPattern + ")|(" + strValidIntegerPattern + ")");

                return !objNotNumberPattern.IsMatch(strNumber) &&
                !objTwoDotPattern.IsMatch(strNumber) &&
                !objTwoMinusPattern.IsMatch(strNumber) &&
                objNumberPattern.IsMatch(strNumber);
            }
            else
            {
                return false;
            }
        }
    }

}

發佈了9 篇原創文章 · 獲贊 8 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章