1. 程式人生 > >AutoCAD2016二次開發&建立Polyline包圍面Polygon

AutoCAD2016二次開發&建立Polyline包圍面Polygon

今天我們來學習一下高版本的AutoCAD開發,使用的2016版,因此開發的環境需要.net4.5支援,這裡使用Visual Studio2012。其實現的功能是利用高版本提供的api介面選擇多段線,然後建立一個包圍線,這其中涉及到距離偏移的選擇。然後使用polygon來建立面,這和其他的地理資訊資料中polygon有點類似,但地理資訊中的polygon,如在arcgis中是具有拓撲計算能力的,好了,這裡說得有點遠了。我們來看一下開發的效果。

當然在開發的時候遇到如下的問題。

在程式碼中加入相應的設定即可,具體實現程式碼如下。

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DrawPolygonAroundPolyline2
{
    public class Class1
    {
        [CommandMethod("dpap")]
        public void demo()
        {

            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            PromptEntityOptions peo = new PromptEntityOptions("\n選擇一條多段線: ");
            peo.SetRejectMessage("\n必須為多段線!");
            peo.AddAllowedClass(typeof(Polyline), true);
            PromptEntityResult per = ed.GetEntity(peo);
            if (per.Status != PromptStatus.OK)
                return;
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                Polyline pline = (Polyline)tr.GetObject(per.ObjectId, OpenMode.ForRead);

                if (pline.Closed)
                {
                    ed.WriteMessage("多段線閉合了.");
                    return;
                }
                var pdr = ed.GetDistance("\n指定偏移距離: ");
                if (pdr.Status != PromptStatus.OK)
                    return;
                var offsetCurves = pline.GetOffsetCurves(pdr.Value);
                if (offsetCurves.Count != 1)
                {
                    ed.WriteMessage("\n曲線建立偏移出現錯誤");
                    foreach (DBObject obj in offsetCurves) obj.Dispose();
                    return;
                }
                using (var polygon = (Polyline)offsetCurves[0])
                {
                    offsetCurves = pline.GetOffsetCurves(-pdr.Value);
                    if (offsetCurves.Count != 1)
                    {
                        ed.WriteMessage("\n曲線建立偏移出現錯誤");
                        foreach (DBObject obj in offsetCurves) obj.Dispose();
                        return;
                    }
                    using (var curve = (Polyline)offsetCurves[0])
                    using (var line = new Line(polygon.EndPoint, curve.EndPoint))
                    {
                        polygon.JoinEntities(new Entity[] { new Line(polygon.EndPoint, curve.EndPoint), curve });
                        polygon.Closed = true;
                        var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                        curSpace.AppendEntity(polygon);
                        tr.AddNewlyCreatedDBObject(polygon, true);
                    }
                }
                tr.Commit();
            }
        }
    }
}

                                                                         更多內容,請關注公眾號