MyNameIsLiLei 发表于 2018-7-25 21:19:29

仿Polyline功能


Jig不好用,界面一直闪,自己写个玩玩,请前辈们指点一下,代码不够严谨


      public void DrawPolyline()
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            DocumentLock dlock = doc.LockDocument();

            //为临时图形得到当前的颜色
            Autodesk.AutoCAD.Colors.Color col = doc.Database.Cecolor;

            //创建一个点集来存储顶点
            Point3dCollection pts = new Point3dCollection();

            //为所有的顶点设置选择选项
            PromptPointOptions opt = new PromptPointOptions("\n设置线段起点或者取消", "Undo");

            //存储临时线段
            List<ObjectId> lines = new List<ObjectId>();

            opt.AllowNone = true;

            //得到的 polyline 第一点
            PromptPointResult res = ed.GetPoint(opt);

            while (res.Status == PromptStatus.OK || res.Status == PromptStatus.Keyword)//有点被选中时的操作
            {
                pts.Add(res.Value);

                if (pts.Count > 1)
                {
                  using (Transaction tran = db.TransactionManager.StartTransaction())
                  {

                        BlockTableRecord btrs = (BlockTableRecord)tran.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                        Line line = new Line(pts, pts);
                        lines.Add(btrs.AppendEntity(line));
                        tran.AddNewlyCreatedDBObject(line, true);
                        tran.Commit();
                  }
                }

                //撤销的时候从这里重新进入循环
            undo:
                opt.BasePoint = pts;

                opt.UseBasePoint = true;

                opt.SetMessageAndKeywords("\n设置线段顶点或者取消", "Undo");

                res = ed.GetPoint(opt);

                if (res.Status == PromptStatus.Keyword)
                {
                  if (res.StringResult.ToLower() == "undo")
                  {
                        if (lines.Count > 0)
                        {
                            using (Transaction tran = db.TransactionManager.StartTransaction())
                            {
                              lines.GetObject(OpenMode.ForWrite).Erase(true);
                              lines.RemoveAt(lines.Count - 1);
                              tran.Commit();
                            }
                            pts.RemoveAt(pts.Count - 1);
                            goto undo;
                        }
                        if (pts.Count == 1)
                        {
                            goto undo;
                        }
                  }
                }
                else if (res.Status != PromptStatus.OK)
                {
                  break;
                }
            }

            if (pts.Count >= 1)
            {
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                  //获取当前的模型/图纸空间
                  BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);

                  //得到当前的 UCS
                  Matrix3d ucs = ed.CurrentUserCoordinateSystem;

                  Point3d origin = new Point3d(0, 0, 0);

                  Vector3d normal = Vector3d.ZAxis;

                  //创建一个临时的 plane 来帮助计算
                  Plane plane = new Plane(origin, normal);

                  //创建 polyline,同时用已经选择的点的数量来指定顶点数
                  Polyline pline = new Polyline(pts.Count);

                  pline.Normal = normal;
                  foreach (Point3d pt in pts)//对点进行坐标转换,为什么要转换,UCS与 OCS的关系?
                  {
                        Point3d transformedPt = pt.TransformBy(ucs);
                        pline.AddVertexAt(pline.NumberOfVertices, plane.ParameterOf(transformedPt), 0, 0, 0);
                  }

                  ObjectId plineId = btr.AppendEntity(pline);
                  tr.AddNewlyCreatedDBObject(pline, true);

                  //将临时线段从数据库中删除
                  foreach (var item in lines)
                  {
                        item.GetObject(OpenMode.ForWrite).Erase(true);
                  }

                  tr.Commit();
                }
            }
            dlock.Dispose();
      }


lifuq1979 发表于 2018-7-28 10:22:20

不懂VBA的路过

oistre 发表于 2018-8-4 09:24:31

下载试用,解决问题
页: [1]
查看完整版本: 仿Polyline功能