如何使生成的文字在多边形的外面!
如何使生成的文字在多边形的外面!发个图看看:如果我是ssget一框选已打散的(list '(0 . "LWPOLYLINE"))线怎么分别四条线相对于其中心的方位?
本帖最后由 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:44 编辑
支持版主的解决方案,学习一下。
VB.NET 2010不能在调试期间编辑lambda表达式代码,必须停止调试退出AutoCAD,C#是这样吗?
如果这个问题不能解决,势必限制了Linq的应用,反复启动AutoCAD实在太麻烦。
高难,还不懂,学习一下。 太厉害了。
学习中 很少在调试阶段编辑代码,一般只有在Cad爆掉才,呵呵
现在总是不断地开Cad的,哎
习惯了,汗 我经常在调试阶段编辑代码,如果编辑的代码不是当前运行的那行,一般调试是不会中断的,可以实时的看到效果,这样就不用重复启动CAD了。 lambda在C#里也无法调试。呵呵 lzh741206 发表于 2010-12-19 23:49 static/image/common/back.gif
lambda在C#里也无法调试。呵呵
又多了一个调试阶段不能编辑的因素。
AutoCAD .NET其它方面都还不错,就是这个调试,比起lisp和VBA的方便程度差太多。
最要命的是调试时不能修改窗体,难以想象大量的对话框迁移起来该多麻烦。
学习一下!
页:
[1]
2