intersect 相交 范围_关于CAD二次开发中(范围线自相交)相交线的问题

在CAD二次开发中,作者遇到了一个难题:如何判断一个由线段组成的闭合区域内是否存在相交线段。文章描述了两种情况,一种是闭合过程中形成相交线,另一种是闭合前已有相交线,并给出了部分代码实现。在代码中,作者使用了MPolygonLoop和LoopCrossesItself方法来检查相交,但在特定情况下无法正确检测到相交线。作者希望寻求解决方案。
摘要由CSDN通过智能技术生成

CAD二次开发对于毕业没多久,又是半路出家的我来说,是一个很大的挑战,遇到过很多难以解决的问题,这次在CAD二次开发遇到一个很苦恼的问题:判断 一个由线段组成的闭合区域中,是否存在着相互之间相交的线段。  如下图所示:

图1       

图2

这是通过图1得到的有相交线的闭合区域图

图3   

图4

这是通过图3得到的有相交线的闭合区域图

这两种绘图方式唯一的区别在于 图1==>图2 是最后一笔闭合才形成的相交线,而 图3==>图4是在最后一笔闭合前就有了相交线  ,但是在判断的时候第一种情况判断不出相交线,第二种可以判断出来。

以下是部分代码:

public static void ExportStringByPolygon(int Chosetype)

{

Interactive myInt = new Interactive();

CreateDrawingObject createObj = new CreateDrawingObject();

Polyline pline = new Polyline();

ObjectId getObjId = ObjectId.Null;

Point3dCollection pointCollection = new Point3dCollection();

switch (Chosetype)

{

case 1:

getObjId = myInt.GetEntityEx2(); //选择实体对象

break;

case 2:

getObjId = myInt.DrawingKKbySelf(); //拉框绘制实体对象

break;

case 3:

getObjId = createObj.AddPolyLine(true); //手动绘制多边形

break;

}

//需要访问Database的操作 需首先将该文档进行锁定,操作完成后,在最后进行释放

DocumentLock dlock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument();

Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

Database db=HostApplicationServices.WorkingDatabase;

MPolygonLoop MPLoop = new MPolygonLoop();

Boolean state = false;

if (getObjId != ObjectId.Null)

{

using (Transaction tran =db.TransactionManager.StartTransaction())

{

Entity Entity = (Entity)tran.GetObject(getObjId, OpenMode.ForRead);

if (Entity is Autodesk.AutoCAD.DatabaseServices.Polyline)

{

pline = (Polyline)Entity;

if (pline.Closed == false)

{

PublicMethod.ShowMessage("\n 多边形未闭合!\n");

}

}

else

{

PublicMethod.ShowMessage("\n 请闭合多边形!\n"); ;

}

if (Entity is Autodesk.AutoCAD.DatabaseServices.Polyline)

{

pline = (Polyline)Entity;

for (int i = 0; i < pline.NumberOfVertices; i++)

{

BulgeVertex bv = new BulgeVertex(pline.GetPoint2dAt(i), pline.GetBulgeAt(i));

MPLoop.Add(bv);

}

MPolygonCrossingCollection MCSelf = MPLoop.LoopCrossesItself(MPLoop, 0, true);

strCrossCount = MCSelf.Count.ToString();

}

if (strCrossCount != "0")

{

PublicMethod.ShowMessage("\n 范围线自相交!\n");

return "selfcross";

}

tran.Commit();

}

}

}

求解惑!!!

转载自:https://blog.csdn.net/YOLIN26/article/details/51787627

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值