zhf7878 发表于 2004-8-6 11:15:00

[ARX]利用AutoCAD 2005.NET API进行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                                                                                                                        {
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                                                                                        {
                                                                                                                       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()
                                                       {
       
                                                       }
                                                       
                                                       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)完整的程序代码请看下面的附件。
这是:这是代码文件:

jszfsoft 发表于 2005-6-28 08:31:00

非常感谢大大的无私奉献

GISc 发表于 2005-10-20 19:56:00

顶一下,谢谢

gjliang 发表于 2005-11-6 22:49:00

感觉为了实现一个任务代码要很多啊,因为不懂,见笑!

myway0103 发表于 2006-6-15 21:41:00

顶下。作了好榜样!~!~

fangweiren 发表于 2006-6-28 21:16:00

大家好,希望有人能给我传几个文件,我的QQ是396857680,谢谢了。
mfc70.lib mfc70d.lib、mfc70u.lib、mfc70ud.lib、mfcs70.lib、mfcs70.pdb、mfcs70d.lib、mfcs70d.pdb、mfcs70u.lib、mfcs70u.pdb、mfcs70ud.lib、mfcs70ud.pdb

tcsl9621 发表于 2006-8-8 23:36:00

谢谢版主,找了好久。呵……
我用VB编,老出错。

lion107 发表于 2006-9-21 11:01:00

支持楼主

zhangbing629 发表于 2007-9-4 15:11:00

无私奉献...顶!!!

darkxp 发表于 2007-11-16 11:56:00

才鸟,本人从昨天,到现在,至少看到你的10余篇帖子..写的确实不错,不过实际应用中,你的有些地方不符,比如,using AutoCAD;这句在VS20005 ACAD2005下行不通我已改好!
页: [1]
查看完整版本: [ARX]利用AutoCAD 2005.NET API进行AutoCAD的二次开发(二)