记录一下CAD二次开发的一些简单实例
1、helloworld
2、画一个圆
3、画一条直线
4、取得图层下的所有对象id
5、得到当前图层的所有object的id
6、取得当前所有图层名称
7、添加图层
using System;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using ;
using AcadApp = ;
using ;
namespace cad开发
{
public class Class1
{
/// <summary>
/// Hello World!!!
/// </summary>
[CommandMethod("HelloWorld")]
public void HelloWorld()
{
Editor ed = ;
("Hello World222");
}
/// <summary>
/// 画一个圆
/// </summary>
[CommandMethod("test")]
public void createCircle()
{ //首先声明我们要使用的对象
Circle circle; //这个是我们要加入到模型空间的圆
BlockTableRecord btr;//要加入圆,我们必须打开模型空间
BlockTable bt; //要打开模型空间,我们必须通过块表(BlockTable)来访问它
//我们使用一个名为‘Transaction’的对象,把函数中有关数据库的操作封装起来
Transaction trans;
//使用 TransactionManager 的 StartTransaction()成员来开始事务处理
trans = ();
//现在创建圆……请仔细看这些参数——注意创建 Point3d 对象的‘New’和 Vector3d 的静态成员 ZAxis
circle = new Circle(new Point3d(10, 10, 0), , 2);
bt = (BlockTable)(, );
//使用当前的空间 Id 来获取块表记录——注意我们是打开它用来写入
btr = (BlockTableRecord)(, );
//现在使用 btr 对象来加入圆
(circle);
(circle, true); //并确定事务处理知道要加入圆!
//一旦完成以上操作,我们就提交事务处理,这样以上所做的改变就被保存了……
();
//…然后销毁事务处理,因为我们已经完成了相关的操作(事务处理不是数据库驻留对象,可以销毁)
();
}
/// <summary>
/// 选择一个点,并显示坐标;选择两个点,并显示距离
/// </summary>
[CommandMethod("selectPoint")]
public void SelectPoint()
{
PromptPointOptions prPointOptions = new PromptPointOptions("Select a point");
PromptPointResult prPointRes;
Editor ed = ;
prPointRes = (prPointOptions);
if ( != )
{
("Error");
}
else
("You selected point: " + ());
PromptDistanceOptions prDistOptions = new PromptDistanceOptions("Find distance, select first point:");
PromptDoubleResult prDistRes;
prDistRes = (prDistOptions);
if ( != )
{
("Error");
}
else
{
("The distance is: " + ());
}
}
[CommandMethod("CreateDivision")]
public void CreateDivision()
{
Database db = ;
Transaction trans = ();
try
{
//首先,获取 NOD……
DBDictionary NOD = (DBDictionary)(, );
//定义一个公司级别的字典
DBDictionary acmeDict;
try
{
//如果 ACME_DIVISION 不存在,则转到 catch 块,这里什么也不做
acmeDict = (DBDictionary)(("ACME_DIVISION"), );
}
catch
{
//如果 ACME_DIVISION 不存在,则创建它并把它加入到 NOD 中……
acmeDict = new DBDictionary();
("ACME_DIVISION", acmeDict);
(acmeDict, true);
}
();
}
finally
{
();
}
}
/// <summary>
/// 画一条直线
/// </summary>
[CommandMethod("FirstLine")]
public static void FirstLine()
{
//获取当前活动图形数据库 ;
Database db = ;
//定义一个指向当前数据库的事务处理,以添加直线
using (Transaction trans = ())
{
BlockTable acBlkTbl;
acBlkTbl = (, ) as BlockTable; //以读方式打开块表.
//以写方式打开模型空间块表记录.
BlockTableRecord acBlkTblRec;
acBlkTblRec = (acBlkTbl[], ) as BlockTableRecord;
Point3d startPoint = new Point3d(0, 100, 0); //直线起点
Point3d endPoint = new Point3d(100, 100, 0); //直线终点
Line line = new Line(startPoint, endPoint); //新建一直线对象
//将图形对象的信息添加到块表记录中,并返回ObjectId对象.
(line);
(line, true); //把对象添加到事务处理中.
(); //提交事务处理
}
}
#region "取得图层下的所有对象id"
/// <summary>
/// 取得图层下的所有对象id
/// </summary>
/// <param name="name">图层名称</param>
/// <returns>id集合</returns>
public ObjectIdCollection GetObjectIdsAtLayer(string name)
{
ObjectIdCollection ids = new ObjectIdCollection();
PromptSelectionResult ProSset = null;
TypedValue[] filList = new TypedValue[1] { new TypedValue((int), name) };
SelectionFilter sfilter = new SelectionFilter(filList);
Editor ed = ;
ProSset = (sfilter);
if ( == )
{
SelectionSet sst = ;
ObjectId[] oids = ();
for (int i = 0; i < ; i++)
{
(oids[i]);
}
}
return ids;
}
#endregion
/// <summary>
/// 得到当前图层的所有几何的id
/// </summary>
[CommandMethod("GetAllId")]
public void GetAllId()
{
Editor ed = ;
ObjectIdCollection ids = GetObjectIdsAtLayer("0");
string str = "";
Database db = ;
//定义一个指向当前数据库的事务处理,以添加直线
using (Transaction trans = ())
{
BlockTable acBlkTbl;
acBlkTbl = (, ) as BlockTable; //以读方式打开块表.
//以写方式打开模型空间块表记录.
BlockTableRecord acBlkTblRec;
acBlkTblRec = (acBlkTbl[], ) as BlockTableRecord;
foreach (ObjectId item in ids)
{
Entity entity = (Entity)(, false, false);
switch (().Name)
{
case "AcDbText":
DBText dbtext = entity as DBText;
string strtext = ;
str += strtext + '\n';
break;
}
}
(str);
(); //提交事务处理
}
}
#region "取得当前所有图层名称"
/// <summary>
/// 取得当前所有图层名称
/// </summary>
/// <returns>图层名称集合</returns>
[CommandMethod("GetAllLayer")]
public ArrayList GetLayerName()
{
ArrayList layers = new ArrayList();
using (Database db = )
{
using (Transaction trans = ())
{
using (LayerTable lt = (LayerTable)(, ))
{
foreach (ObjectId id in lt)
{
LayerTableRecord ltr = (LayerTableRecord)(id, );
();
}
}
();
}
}
return layers;
}
#endregion
#region 添加图层
/// <summary>
/// 添加图层
/// </summary>
/// <param name="layName"></param>
/// <param name="layColor"></param>
private ObjectId AddLayer(string layName, short layColor)
{
ObjectId oidReturn = new ObjectId(); ;
using (())
{
Database database = ;
Editor editor = ;
using (Transaction transaction = ())
{
try
{
ObjectId id;
LayerTable table = (, ) as LayerTable;
LayerTableRecord record = new LayerTableRecord();
if ((layName))
{
id = ;
record = (id, ) as LayerTableRecord;
= false;
= false;
if (id != )
{
= false;
}
}
else
{
= layName;
id = (record);
(record, true);
}
= (, layColor);
= id;
oidReturn = id;
();
}
catch ( exception)
{
("Error in addLayer2(): " + );
}
}
return oidReturn;
}
}
#endregion
/// <summary>
/// 删除元素
/// </summary>
/// <param name="objectIdCollection"></param>
private void DeleteAllEntity(ObjectIdCollection objectIdCollection)
{
Document doc = ;
SetFocus();
Database acCurDb = ;
Editor ed = ;
//启动事务
using (Transaction acTrans = ())
{
foreach (ObjectId id in objectIdCollection)
{
Entity hatchobj = (id, ) as Entity;
();//删除
}
();
}
}
}
}
一些需要注意的问题:
1、非模态窗口需要锁定文档
Document doc = ;
using (())
2、非模态窗口需要点击一下cad软件,才能够出结果的解决办法
//切换窗口焦点
[DllImport("", EntryPoint = "SetFocus")]
public static extern int SetFocus(IntPtr hWnd);
//然后引用该方法
SetFocus();
3、成组
Group group = new Group(“description”, true);
(objectIdCollection);
(group);
(group, true);
4、显示Message
(“Message”);