EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

萧闫子 发表于 2014-1-8 14:00:32

[即时预览] 多段线即时预览


/////////////////////////////////////////////////////////////////////////////////////////////////
//http://www.eabim.net EaBIM论坛
/////////////////////////////////////////////////////////////////////////////////////////////////
using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;

namespace Sample
{
    class PolylineJigSample
    {
      
      public void PolylineJig()
      {
            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
            PromptPointOptions opts = new PromptPointOptions("\n选择起点:");
            PromptPointResult res = ed.GetPoint(opts);
            if (res.Status != PromptStatus.OK)
                return;
            Point3dCollection pts = new Point3dCollection();
            pts.Add(res.Value);
            PolylineJig jig = new PolylineJig(pts);
            int pcount = pts.Count;
            ed.Drag(jig);
            while (jig.Status == 1)
            {
                pts = new Point3dCollection();
                for (int i = 0; i <= pcount; i++)
                {
                  pts.Add(((Polyline)jig.GetEntity()).GetPoint3dAt(i));
                }
                jig = new PolylineJig(pts);
                pcount += 1;
                ed.Drag(jig);
            }
            if (jig.Status == 0)
                return;
            ToModelSpace(jig.GetEntity());
      }
      /// <summary>
      /// 添加对象到模型空间
      /// </summary>
      /// <param name="ent">要添加的对象</param>
      /// <returns></returns>
      public static ObjectId ToModelSpace(Entity ent)
      {
            Database db = HostApplicationServices.WorkingDatabase;
            ObjectId entId;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt, OpenMode.ForWrite);
                entId = btr.AppendEntity(ent);
                trans.AddNewlyCreatedDBObject(ent, true);
                trans.Commit();
            }
            return entId;
      }
    }
    public class PolylineJig : EntityJig
    {
      Point3d endPoint, startPoint;
      int status = 1;
      int pcount = 0;
      public PolylineJig(Point3dCollection p3ds)
            : base(new Autodesk.AutoCAD.DatabaseServices.Polyline())
      {
            for (int i = 0; i < p3ds.Count; i++)
            {
                ((Autodesk.AutoCAD.DatabaseServices.Polyline)Entity).AddVertexAt(i, new Point2d(p3ds.X, p3ds.Y), 0, 0, 0);
            }
            ((Autodesk.AutoCAD.DatabaseServices.Polyline)Entity).AddVertexAt(p3ds.Count, new Point2d(p3ds.X, p3ds.Y), 0, 0, 0);
            pcount = p3ds.Count;
            endPoint = p3ds;
            startPoint = endPoint;
      }
      protected override bool Update()
      {
            try
            {
                ((Autodesk.AutoCAD.DatabaseServices.Polyline)Entity).SetPointAt(pcount, new Point2d(endPoint.X, endPoint.Y));
            }
            catch (System.Exception ex)
            {
                return false;
            }
            return true;
      }
      protected override SamplerStatus Sampler(JigPrompts prompts)
      {
            try
            {
                JigPromptPointOptions jigopts = new JigPromptPointOptions();
                jigopts.UserInputControls = UserInputControls.NullResponseAccepted;
                jigopts.BasePoint = startPoint;
                jigopts.UseBasePoint = true;
                jigopts.Message = "\n选择下一个顶点:";
                PromptPointResult dres = prompts.AcquirePoint(jigopts);
                if (dres.Value != endPoint)
                {
                  endPoint = dres.Value;
                }
                else
                {
                  return SamplerStatus.NoChange;
                }
                if (dres.Status == PromptStatus.Cancel || dres.Status == PromptStatus.Error)
                {
                  status = 0;
                  return SamplerStatus.Cancel;
                }
                else if (dres.Status == PromptStatus.None)
                {
                  status = 2;
                  return SamplerStatus.Cancel;
                }
                else
                {
                  return SamplerStatus.OK;
                }
            }
            catch (System.Exception ex)
            {
                return SamplerStatus.OK;
            }
      }
      public int Status { get { return status; } }
      public Entity GetEntity()
      {
            return Entity;
      }
    }
}



页: [1]
查看完整版本: [即时预览] 多段线即时预览