利用AutoCAD 2005.NET API进行AutoCAD的二次开发(二)
--多段线
大家好!今天讲的内容是多段线。在AutoCAD 2005.NET API中,有3个表示多段线的类,即Polyline、Polyline2d、Polyline3d,如果按照字面意思,那应该是Polyline2d表示VBA中的LightWeightPolyline(轻量多线段),而Polyline3d则应该表示三维多线段。但令人感到困惑的是实际上在AutoCAD 2005.NET API中,由Polyline2d和Polyline3d创建的都是三维多线段,而Polyline才会创建轻量多线段(不知是否是一个bug?!)。基于这种情况,我会采用Polyline来表示轻量多线段,而用Polyline3d来表示三维多线段。对于在程序中加入相应的命名空间和一些前期的准备工作,请大家参考“利用AutoCAD 2005.NET API进行AutoCAD的二次开发(一)”。不要再另外创建新的工程,直接在“利用AutoCAD 2005.NET API进行AutoCAD的二次开发(一)” 创建的工程中加入相应的函数,这样可以创建一个自己的底层函数库。下面是编程的具体步骤:
(1) 创建轻量多线段的基准函数(AddLWPolyline)。其实现的步骤如下:
public Polyline AddLWPolyline(Point2dCollection ptArr, double width)
{
Polyline pline = new Polyline();//声明一Polyline对象
try
{
Initialize();//相关的初始化工作
for (int i = 0; i < ptArr.Count; i++)
{
pline.AddVertexAt(i, ptArr, 0, width, width);
//加入组成多线段的点
}
AddEntity(pline);//自定义函数,用于加入生成的Polyline
}
finally
{
DisposeAll();
}
return pline;
}
程序中的自定义函数AddEntity的代码如下:
public void AddEntity(Entity entity)
{
btr.AppendEntity(entity);
tm.AddNewlyCreatedDBObject(entity, true);
myT.Commit();
}
这个函数的作用是简化加入相关对象的过程。
(2)根据二维的起点和终点创建轻量多线段。
public Polyline AddLWPolyline(Point2d ptStart, Point2d ptEnd, double width)
{
Polyline pline;
Point2dCollection ptArr = new Point2dCollection(); ;
ptArr.Add(ptStart);
ptArr.Add(ptEnd);
pline = AddLWPolyline(ptArr, width);
return pline;
}
(3) 创建三维多线段的基准函数(AddPolyline)。
public Polyline3d AddPolyline(Point3dCollection ptArr)
{
Polyline3d pline;
try
{
Initialize();
pline = new Polyline3d(Poly3dType.SimplePoly, ptArr, false);
AddEntity(pline);
}
finally
{
DisposeAll();
}
return pline;
}
(5) 已知起点和终点,创建三维多线段。
public Polyline3d AddPolyline(Point3d pt1, Point3d pt2)
{
Polyline3d pline;
Point3dCollection ptArr = new Point3dCollection();
ptArr.Add(pt1);
ptArr.Add(pt2);
pline = AddPolyline(ptArr);
return pline;
}
(6)创建正多边形。输入的参数是中心、边数、外接圆半径、宽度和旋转角度。
public Polyline AddPolygon(Point2d center, int number, double radius, double width, double angle)
{
Polyline pline;
Point2dCollection ptArr = new Point2dCollection();
double ang;
ang = 2 * Math.PI / number;
Point2d pt2d = new Point2d();
for (int i = 0; i <=number; i++)
{
pt2d.X = center.X + radius * Math.Cos(i * ang);
pt2d.Y = center.Y + radius * Math.Sin(i * ang);
ptArr.Add(pt2d);
}
pline = AddLWPolyline(ptArr, width);
return pline;
}
(7)创建矩形。
public Polyline AddRectangle(Point2d pt1, Point2d pt2, double width)
{
Polyline pline;
Point2dCollection ptArr = new Point2dCollection();
Point2d pt3 = new Point2d(pt2.X,pt1.Y);
Point2d pt4 = new Point2d(pt1.X, pt2.Y);
ptArr.Add(pt1);
ptArr.Add(pt3);
ptArr.Add(pt2);
ptArr.Add(pt4);
ptArr.Add(pt1);
pline = AddLWPolyline(ptArr, width);
return pline;
}
(8)添加测试代码。
#region Using directives
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using ZHFArxLibrary;
#endregion
namespace Polylines
{
public class Class1
{
public Class1()
{
}
[CommandMethod("AddPolyline")]
public static void AddPolyLine()
{
Arx arx = new Arx();
Point2dCollection ptArr1 = new Point2dCollection();
ptArr1.Add(new Point2d(0, 0));
ptArr1.Add(new Point2d(60, 0));
ptArr1.Add(new Point2d(60, 40));
ptArr1.Add(new Point2d(0, 60));
arx.AddLWPolyline(ptArr1, 0.2);
Point3dCollection ptArr2 = new Point3dCollection();
ptArr2.Add(new Point3d(100, 0, 0));
ptArr2.Add(new Point3d(160, 0, 0));
ptArr2.Add(new Point3d(160, 40, 0));
arx.AddPolyLine(ptArr2);
arx.AddLWPolyline(new Point2d(100, 100), new Point2d(150, 100), 0);
arx.AddPolyLine(new Point3d(150, 100, 0), new Point3d(200, 100, 0));
arx.AddPolygon(new Point2d(30, 130), 6, 30, 0, 0);
arx.AddRectangle(new Point2d(100, 100), new Point2d(170, 140),0);
}
}
}
把(8)中的工程编译。然后启动AutoCAD,在命令行中键入netload命令,在弹出的对话框中选择刚编译好的dll文件。在命令行中键入AddPolyline(就是你在(8)中声明的AutoCAD .NET命令),应该可以看到结果了。
(9)完整的程序代码请看下面的附件。
这是教程:
这是代码文件:
|