码迷,mamicode.com
首页 > Web开发 > 详细

.NET AutoCAD二次开发之路(一、直线篇)

时间:2015-12-08 01:55:21      阅读:599      评论:0      收藏:0      [点我收藏+]

标签:

我以前只有一点VB的基础,C语言也只是看过,学这个CAD二次开发,也是借工作之余研究下,我到现在已经从事机械行业5年了,中国的工业设计环境区别太大,各行各业的技术现状也不尽相同,但有一点是可以肯定的,那就是自动化,国外都在工业4.0了,我们还在互联网+,哎太out了,我也赶紧进修下,要不就淘汰了。所以我选择了CAD二次开发,主要还是跟专业接近,希望能越学越精吧,未来就让未来的我去面对!

今天主要总结下直线的创建,要想能在CAD中生成直线或者其他图形,都必须遵循几个步骤,那就是:

1.获取当前图形的数据库;

获取图形数据库主要有两种发法:

(1)Database db = HostApplicationServices.WorkingDatabase;

(2)Document doc=Appplication.DocumentManager.MdiActiveDocument;

  Database db = acDoc.Database;

才鸟的这本书上主要是采用第一种方法,CAD二次开发人员手册主要是采用第二种方法,我也采用的第一种,因为代码少啊;

2.创建图形对象;

  创建所需要的图形,就要用到构造函数或者是扩展函数,譬如圆形、圆弧等等;今天我就总结下直线的创建。在.NET中直线的构造函数有两种形式,这两种构造函数是.NET已经定义好了的,可以直接调用;他们分别是:

(1)public Line();

(2)public Line(Point3d pointer1,Point3d pointer2)

众所周知,直线是有两个点之间的连线构成的,那么要得到一条直线,就必须给出这条直线的两个点,起始点和终止点;由上面的构造函数(Piont3d)可以看出,起始点和终止点需要通过三维坐标来创建,这个在.NET中也有他的构造函数(也可以通过代码中的“查看定义”找到):

Public Point3d(double x,double y,double z);

那么定义一条直线就可以这样写代码:

Line line=new Line(new Point3d(),new Point3d(200,0,0));

New表示要实例化一个对象,Point3d()表示原点,坐标为(0,0,0).

3.打开图形数据库图表;

图形数据中有很多类型的图表,直线就是存在块表下。要创建直线就必须先打开块表,以只读的方式打开块表的代码可以这样写:

BlockTable acBlkTbl;

acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForRead) as BlockTable;

4.打开一个存储图形对象的块表记录;

一个块表中可以有很多个块表记录,每个对象都有一个对应的块表记录;以写的方式打开块表记录代码可以这样写:

BlockTableRecord acBlkTblRec;
acBlkTblRec = cTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;

 

5.将该图形添加到块表记录中;

acBlkTblRec.AppendEntity(acLine);

说实话我现在也不是很理解。

6.通知事务处理管理器,并提交事务处理,这样就可以将创建的图形显示到CAD模型空间中了;在这我感觉步骤3也可以放到步骤4和5后面,我的代码也有这样写的,但是也没出现错误。

将图形添加到事物管理器中的代码这样写:

acTrans.AddNewlyCreatedDBObject(acLine, true);

最后就是提醒事物处理器,我完成了,你可以显示了。

acTrans.Commit();

整体代码:

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using DotNetARX;
namespace Lines
{
    public class Lines
    {
        [CommandMethod("FirstLine")]
        public static void FirstLine()
        {
            //获取当前活动图形数据库
            Database db= HostApplicationServices.WorkingDatabase;
            Point3d startPoint=new Point3d(0, 100, 0);  //直线起点
            Point3d endPoint=new Point3d(100, 100, 0); //直线终点
            Line line=new Line(startPoint, endPoint); //新建一直线对象   
            //定义一个指向当前数据库的事务处理,以添加直线
            using (Transaction trans=db.TransactionManager.StartTransaction())
            {
                BlockTable bt=(BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead); //以读方式打开块表.
                //以写方式打开模型空间块表记录.
                BlockTableRecord btr=(BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                //将图形对象的信息添加到块表记录中,并返回ObjectId对象.
                btr.AppendEntity(line);
                trans.AddNewlyCreatedDBObject(line, true); //把对象添加到事务处理中.
                trans.Commit(); //提交事务处理
            }
        }

     }
}

不过我经常是这样写:

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using DotNetARX;
namespace Lines
{
    public class Lines
    {
        [CommandMethod("FirstLine")]
        public static void FirstLine()
        {
            //获取当前活动图形数据库
            Database db= HostApplicationServices.WorkingDatabase;
            //定义一个指向当前数据库的事务处理,以添加直线
            using (Transaction trans=db.TransactionManager.StartTransaction())
            {
                BlockTable acBlkTbl;
                acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForRead) as BlockTable; //以读方式打开块表.
                //以写方式打开模型空间块表记录.
                BlockTableRecord acBlkTblRec;
                acBlkTblRec=acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;
                Point3d startPoint=new Point3d(0, 100, 0);  //直线起点
                Point3d endPoint=new Point3d(100, 100, 0); //直线终点
                Line line=new Line(startPoint, endPoint); //新建一直线对象
                //将图形对象的信息添加到块表记录中,并返回ObjectId对象.
                acBlkTblRec.AppendEntity(line);
                trans.AddNewlyCreatedDBObject(line, true); //把对象添加到事务处理中.
                trans.Commit(); //提交事务处理
            }
        }

     }
}

我也是刚学,如有不对的地方,望大家及时指正,我将感激不尽!

.NET AutoCAD二次开发之路(一、直线篇)

标签:

原文地址:http://www.cnblogs.com/twofly/p/5027944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!