single-yu 发表于 2010-12-18 13:00:20

如何使生成的文字在多边形的外面!

如何使生成的文字在多边形的外面!发个图看看:

894560869 发表于 2019-4-14 10:30:44

如果我是ssget一框选已打散的(list '(0 . "LWPOLYLINE"))线怎么分别四条线相对于其中心的方位?

雪山飞狐_lzh 发表于 2010-12-18 13:28:17

本帖最后由 lzh741206 于 2010-12-18 13:39 编辑

    public enum PointOnRegionType
    {
      Inside,
      On,
      Outside,
      Error
    }

      public static PointOnRegionType PointOnRegion(this IEnumerable<Point2d> pts, Point2d pt)
      {

            //遍历点集并生成首尾连接的多边形
            LoopList<Point2d> ptlst = new LoopList<Point2d>(pts);
            if(ptlst.Count < 3)
                return PointOnRegionType.Error;

            var ls2ds = new List<LineSegment2d>();
            foreach (var node in ptlst.GetNodes())
            {
                ls2ds.Add(new LineSegment2d(node.Value, node.Next.Value));
            }
            var cc2d = new CompositeCurve2d(ls2ds.ToArray());

            //在多边形上?
            if (cc2d.IsOn(pt, new Tolerance(1e-4, 1e-4)))
                return PointOnRegionType.On;

            //在最小包围矩形外?
            var bb2d = cc2d.BoundBlock;
            if (!bb2d.Contains(pt))
                return PointOnRegionType.Outside;

            //
            bool flag = false;
            foreach (var node in ptlst.GetNodes())
            {
                var pt1 = node.Value;
                var pt2 = node.Next.Value;
                if (pt.Y < pt1.Y && pt.Y < pt2.Y)
                  continue;
                if (pt1.X < pt.X && pt2.X < pt.X)
                  continue;
                Vector2d vec = pt2 - pt1;
                double t = (pt.X - pt1.X) / vec.X;
                double y = t * vec.Y + pt1.Y;
                if (y < pt.Y && t >= 0 && t <= 1)
                  flag = !flag;
            }

            return flag ? PointOnRegionType.Inside : PointOnRegionType.Outside;

      }LoopList类在这里找http://bbs.mjtd.com/thread-82110-1-1.html
测试代码:
      
      public static void Test4()
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            
            PromptEntityOptions optsEnt = new PromptEntityOptions("\nSelect a LWPolyLine:");
            optsEnt.SetRejectMessage("\nNot a LWPolyLine!");
            optsEnt.AddAllowedClass(typeof(LWPolyline), false);
            PromptEntityResult resEnt = ed.GetEntity(optsEnt);


            if (resEnt.Status == PromptStatus.OK)
            {
                Database db = doc.Database;
                using (Transaction tr = db.TransactionManager.StartTransaction())
                {

                  LWPolyline pl = tr.GetObject(resEnt.ObjectId, OpenMode.ForRead) as LWPolyline;
                  var ptlst =
                        Enumerable
                        .Range(0, pl.NumberOfVertices)
                        .Select(i => pl.GetPoint2dAt(i));

                  PromptPointOptions optPnt = new PromptPointOptions("\nInput a Point:");
                  optPnt.AllowNone = true;
                  PromptPointResult resPnt = ed.GetPoint(optPnt);
                  while (resPnt.Status == PromptStatus.OK)
                  {
                        var res = ptlst.PointOnRegion(resPnt.Value.Convert2d(new Plane()));
                        ed.WriteMessage("\nPoint:{0},Result:{1}" ,resPnt.Value, res);
                        resPnt = ed.GetPoint(optPnt);
                  }

                }
            }
      }

河伯 发表于 2010-12-18 20:38:09

本帖最后由 河伯 于 2010-12-18 20:44 编辑

支持版主的解决方案,学习一下。
VB.NET 2010不能在调试期间编辑lambda表达式代码,必须停止调试退出AutoCAD,C#是这样吗?
如果这个问题不能解决,势必限制了Linq的应用,反复启动AutoCAD实在太麻烦。

aceowen 发表于 2010-12-18 20:40:16

高难,还不懂,学习一下。

zz0147 发表于 2010-12-18 21:17:43

太厉害了。
学习中

雪山飞狐_lzh 发表于 2010-12-18 21:54:42

很少在调试阶段编辑代码,一般只有在Cad爆掉才,呵呵
现在总是不断地开Cad的,哎
习惯了,汗

hmxmylove 发表于 2010-12-19 23:40:03

我经常在调试阶段编辑代码,如果编辑的代码不是当前运行的那行,一般调试是不会中断的,可以实时的看到效果,这样就不用重复启动CAD了。

雪山飞狐_lzh 发表于 2010-12-19 23:49:10

lambda在C#里也无法调试。呵呵

河伯 发表于 2010-12-20 18:44:10

lzh741206 发表于 2010-12-19 23:49 static/image/common/back.gif
lambda在C#里也无法调试。呵呵

又多了一个调试阶段不能编辑的因素。
AutoCAD .NET其它方面都还不错,就是这个调试,比起lisp和VBA的方便程度差太多。
最要命的是调试时不能修改窗体,难以想象大量的对话框迁移起来该多麻烦。

yanglin112 发表于 2011-10-27 09:12:28

学习一下!
页: [1] 2
查看完整版本: 如何使生成的文字在多边形的外面!