当前位置:文档之家› CAD开发Curve求交

CAD开发Curve求交

///


/// 裁剪内部图形
///

public void CIG()
{
try
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

//多边形的顶点
Point3dCollection PloygonCol = new Point3dCollection();
//多边形的id
ObjectId PloygonID = ObjectId.Null;
//判断实体是否存在扩展数据
int IsExist = 0;//0:表示不存在 1:表示存在

PromptEntityOptions entityOption = new PromptEntityOptions("\n--请选择要裁剪的闭合区域:");
Continue0:
PromptEntityResult entityRes = ed.GetEntity(entityOption);
if (entityRes.Status != PromptStatus.OK)
return;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
Entity ent = (Entity)trans.GetObject(entityRes.ObjectId, OpenMode.ForRead);
if (ent.GetType().Name == "Circle")
{
MessageBox.Show("请选择有效的闭合实体.", "提示");
goto Continue0;
}

//获取闭合实体的顶点坐标
Polyline3d polyline3d;
Polyline poly;
Curve curve;
curve = (Curve)ent;


if (ent.GetType().Name.Substring(ent.GetType().Name.Length - 2, 2).ToString() == "3d")
{
polyline3d = (Polyline3d)trans.GetObject(entityRes.ObjectId, OpenMode.ForRead);
if (polyline3d.Closed == false)//不闭合
{
MessageBox.Show("您选择的实体是不闭合的,请重新选择.", "提示");
goto Continue0;
}
PloygonID = polyline3d.ObjectId;
foreach (ObjectId vId in polyline3d)
{
PolylineVertex3d v3d = (PolylineVertex3d)trans.GetObject(vId, OpenMode.ForRead);
PloygonCol.Add(v3d.Position);
}
}
else
{
poly = (Polyline)trans.GetObject(entityRes.ObjectId, OpenMode.ForRead);
if (poly.Closed == false)//不闭合
{
MessageBox.Show("您选择的实体是不闭合的,请重新选择.", "提示");
goto Continue0;
}
PloygonID = poly.ObjectId;
for

(int i = 0; i < poly.NumberOfVertices; i++)
PloygonCol.Add(poly.GetPoint3dAt(i));
}

//遍历实体
TypedValue[] tvs = new TypedValue[] { };
SelectionFilter sf = new SelectionFilter(tvs);
PromptSelectionResult psr = ed.SelectAll(sf);
if (psr.Status != PromptStatus.OK)
{
https://www.doczj.com/doc/f719014513.html,mit();
return;
}
SelectionSet SS = psr.Value;
//获取所有图形的objectid
ObjectId[] idArray = SS.GetObjectIds();

for (int i = 0; i < idArray.Length; i++)
{
//进行打断的条件
if (idArray[i] == PloygonID)//选中的闭合实体不进行打断
continue;
Entity ENT;
try
{
ENT = (Entity)trans.GetObject(idArray[i], OpenMode.ForWrite);
}
catch (System.Exception ex)
{
continue;
}
if (ENT.GetType().Name == "DBText" || ENT.GetType().Name == "MText")//文本不进行打断
continue;

//自动生成的临时闭合实体的objectid
ObjectId SnapObjectid = ObjectId.Null;
//定义集合
Point3dCollection col = new Point3dCollection();//判断是否有相交的实体
DoubleCollection pars = new DoubleCollection();
DBObjectCollection polyObjectCol;//打断的objectid集合
ObjectId _lineObjectid = ObjectId.Null;
//定义不同的曲线
Curve TraversalEnt;
if (ENT.GetType().Name.Substring(ENT.GetType().Name.Length - 2, 2).ToString() == "3d")//将矩形转换为三维图形
{
Point3dCollection point3dcol = PloygonCol;
point3dcol.Add(PloygonCol[0]);
Polyline3d pl = new Polyline3d(Poly3dType.SimplePoly, PloygonCol, false);
SnapObjectid = CM.AppendEntity(pl);
curve = (Curve)pl;
TraversalEnt = (Curve)ENT;
}
else
{
TraversalEnt = (Curve)ENT;
try
{
if (TraversalEnt.StartPoint.Z != TraversalEnt.EndPoint.Z)
{

if (ENT is Line)
{
Line _line = new Line(new Point3d(TraversalEnt.StartPoint.X, TraversalEnt.StartPoint.Y, 0), new Point3d(TraversalEnt.EndPoint.X, TraversalEnt.EndPoint.Y, 0));
_https://www.doczj.com/doc/f719014513.html,yer = https://www.doczj.com/doc/f719014513.html,yer;
//TraversalEnt.Erase()
_lineObjectid = CM.AppendEntity(_line);
TraversalEnt = (Curve)_line;
Tools.Erase(ENT.ObjectId);
}
curve = (Curve)ent;
}
else
{
if (TraversalEnt.StartPoint.Z == 0)
{
curve = (Curve)ent;
}
else
{
Point3dCollection _pt3dCol = new Point3dCollection();
for (int k = 0; k < PloygonCol.Count; k++)
{
_pt3dCol.Add(new Point3d(PloygonCol[k].X, PloygonCol[k].Y, TraversalEnt.StartPoint.Z));
}
Polyline3d _polyline = new Polyline3d(Poly3dType.SimplePoly, _pt3dCol, true);
curve = (Curve)_polyline;
}
}
}
catch (System.Exception ex)
{
curve = (Curve)ent;
}
//curve = (Curve)ent;
}

TraversalEnt.IntersectWith(curve, Intersect.OnBothOperands, col, 0, 0);//求交点
Point3d[] pt = new Point3d[col.Count];
if (col.Count != 0)//有焦点
{
try
{
//确定点一定在遍历的实体上
for (int j = 0; j < col.Count; j++)
{
col[j] = TraversalEnt.GetClosestPointTo(col[j], false);
pars.Add(TraversalEnt.GetDistAtPoint(col[j]));
pt[j] = col[j];
}
Array.Sort(pars.ToArray(), pt);
polyObjectCol = TraversalEnt.GetSplitCurves(new Point3dColl

ection(pt));
//删除原来遍历的实体
Tools.Erase(idArray[i]);
if (SnapObjectid != ObjectId.Null)
Tools.Erase(SnapObjectid);
if (_lineObjectid != ObjectId.Null)
{
Tools.Erase(_lineObjectid);
}
//重新绘制打断的图形
foreach (Entity ent1 in polyObjectCol)//////该操作不会使扩展数据丢失
{
//有扩展数据的还要写入扩展数据
Curve cu;
cu = (Curve)ent1;
CM.AppendEntity(cu);
}
}
catch (System.Exception ex)
{
continue;
}
}
}

#region 重新遍历实体并删除不在区域内的实体

// 重新遍历删除
tvs = new TypedValue[] { };
sf = new SelectionFilter(tvs);
psr = ed.SelectAll(sf);
if (psr.Status == PromptStatus.OK)
{
SS = psr.Value;
idArray = SS.GetObjectIds();
for (int i = 0; i < idArray.Length; i++)
{
try
{
if (idArray[i] == PloygonID)
continue;
Point3d pt;
Entity ety = (Entity)Tools.GetDBObject(idArray[i]);
if (ety.GetType().Name == "DBText" || ety.GetType().Name == "MText")
{
if (ety.GetType().Name == "DBText")
{
DBText text = (DBText)ety;
pt = text.Position;
}
else if (ety.GetType().Name == "MText")
{
MText te = (MText)ety;
pt = te.Location;
}
}
else
{
Curve cu;
cu = (Curve)Tools.GetDBObject(idArray[i]);

pt = cu.GetPointAtDist(0.0008);//取最近的点坐标
}
if (CM.CheckInPloygon(pt, PloygonCol))//不在区域内 删除
{
Tools.Erase(idArray[i]);
}
}
catch (System.Exception ex)
{
continue;
}
}
}

#endregion

https://www.doczj.com/doc/f719014513.html,mit();
}
}
catch (System.Exception ex)
{
MessageBox.Show("Exception Caught: " + ex.ToString(), "提示");
}
}

相关主题
文本预览
相关文档 最新文档