using GrxCAD.ApplicationServices; using GrxCAD.DatabaseServices; using GrxCAD.EditorInput; using GrxCAD.Geometry; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HCTools { class CutContourLine { public static string sqxlayer; public static string jqxlayer; public static int mapscale; public static double scalelen; public static double lenIgnore; public static double eledvalue; public void ccls() { DocumentLock documentlock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument(); Document doc = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; //类全局变量 //存储地图图层 //System.Collections.ArrayList layerlist = new System.Collections.ArrayList(); LayerTable layertable = null; bool openflag = true; List plentitycollection = new List(); List plentitycollection1 = new List(); //保存裁剪掉的等高线 List cdentity = new List(); #region//第一个事务 获取计曲线 using (Transaction tran = doc.TransactionManager.StartTransaction()) { //layertable = tran.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; ////获取图层 //foreach (ObjectId id in layertable) //{ // DocumentLock docLock = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument(); // LayerTableRecord lyrtbrec = tran.GetObject(id, OpenMode.ForWrite) as LayerTableRecord; // docLock.Dispose(); // layerlist.Add(lyrtbrec.Name); //} //CLSelectForm clsf = new CLSelectForm(layerlist); //if (clsf.ShowDialog() == DialogResult.OK) //{ // openflag = true; // mapscale = clsf.mapscale; // sqxlayer = clsf.SQX; // jqxlayer = clsf.JQX; // scalelen = clsf.ScaleLength; // lenIgnore = clsf.LenIgnore; // eledvalue = clsf.EleDValue; //} if (openflag == true) { ///带1的为首曲线过滤,没有的是计曲线过滤 TypedValue[] tv = new TypedValue[1]; TypedValue[] tv1 = new TypedValue[1]; tv.SetValue(new TypedValue((int)DxfCode.LayerName, jqxlayer), 0); tv1.SetValue(new TypedValue((int)DxfCode.LayerName, sqxlayer), 0); SelectionFilter sf = new SelectionFilter(tv); SelectionFilter sf1 = new SelectionFilter(tv1); //doc.Editor.WriteMessage("请选择计曲线!"); //PromptSelectionResult psr = doc.Editor.GetSelection(sf); PromptSelectionResult psr = doc.Editor.SelectAll(sf); PromptSelectionResult psr1 = doc.Editor.SelectAll(sf1); if (psr.Status == PromptStatus.OK && psr1.Status == PromptStatus.OK) { //// 以只读方式打开块表记录 Open the Block table record for read BlockTable acbt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //// 以写方式打开模型空间块表记录 Open the Block table record Model space for write BlockTableRecord acblr = tran.GetObject(acbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; SelectionSet ss = psr.Value; //// 以只读方式打开块表记录 Open the Block table record for read SelectionSet ss1 = psr1.Value; foreach (ObjectId idpl in ss.GetObjectIds()) { Entity enpl = tran.GetObject(idpl, OpenMode.ForWrite, true) as Entity; if (enpl is Polyline) { Polyline pl = enpl as Polyline; if (pl.Elevation != 0) { plentitycollection.Add(enpl); } } else if (enpl is Polyline2d) { Polyline2d pl2d = enpl as Polyline2d; if (pl2d.Elevation != 0) { plentitycollection.Add(enpl); } } } foreach (ObjectId idp2 in ss1.GetObjectIds()) { Entity enp2 = tran.GetObject(idp2, OpenMode.ForWrite, true) as Entity; if (enp2 is Polyline) { Polyline pl = enp2 as Polyline; if (pl.Elevation != 0) { plentitycollection1.Add(enp2); } } else if (enp2 is Polyline2d) { Polyline2d pl2d = enp2 as Polyline2d; if (pl2d.Elevation != 0) { plentitycollection1.Add(enp2); } } } } else doc.Editor.WriteMessage("没有选择到任何实体\r\n"); //////////////////////////////这个气死我了 doc.Editor.WriteMessage("程序开始运行\r\n.........\r\n......\r\n...\r\n"); tran.Commit(); tran.Dispose(); } else { MessageBox.Show("请选择相应的每一个参数!", "警告"); return; } }//end using #endregion #region//检查、裁剪等高线 if (plentitycollection.Count > 0) { //根据高程将计曲线排序 plentitycollection.Sort(CompareDGXByElevation); //删除重叠,重复的等高线 //int count = RemoveOverlapPolyline(ref plentitycollection); ////////////////////方便调试 仅此而已 //List test = new List(); //foreach (Entity en in plentitycollection) //{ // Polyline2d pl = en as Polyline2d; // if (pl != null) // test.Add(pl); //} //List test00 = new List(); //foreach (Entity en in plentitycollection) //{ // Polyline pl = en as Polyline; // if (pl != null) // test00.Add(pl); //} /////////////////// //以每条计曲线为循环变量 for (int i = 0; i < plentitycollection.Count - 1; i++) { Point3dCollection pt3dcoll = new Point3dCollection(); Entity en1 = plentitycollection[i]; double ele1 = 0; Point2d pten1start = new Point2d();// Point2d pten1end = new Point2d();// if (en1 is Polyline) { Polyline pl = en1 as Polyline; pten1start = new Point2d(pl.StartPoint.X, pl.StartPoint.Y); pten1end = new Point2d(pl.EndPoint.X, pl.EndPoint.Y); ele1 = Convert.ToDouble(pl.Elevation.ToString("f1")); pl.GetStretchPoints(pt3dcoll); } else if (en1 is Polyline2d) { Polyline2d pl2d = en1 as Polyline2d; pten1start = new Point2d(pl2d.StartPoint.X, pl2d.StartPoint.Y); pten1end = new Point2d(pl2d.EndPoint.X, pl2d.EndPoint.Y); ele1 = Convert.ToDouble(pl2d.Elevation.ToString("f1")); pl2d.GetStretchPoints(pt3dcoll); } int j = 1; Entity en2 = null; double ele2 = 0, ele = 0; Point2d pten2start = new Point2d(); Point2d pten2end = new Point2d(); double startlength = 9999999, endlength = 9999999; //寻找一条等高线(计曲线)相邻的等高线 while (ele <= ele1 + eledvalue) { Entity entemp = plentitycollection[j]; if (entemp is Polyline) { Polyline pl = entemp as Polyline; ele = Convert.ToDouble(pl.Elevation.ToString("f1")); if (ele == ele1 + eledvalue) { pten2start = new Point2d(pl.StartPoint.X, pl.StartPoint.Y); pten2end = new Point2d(pl.EndPoint.X, pl.EndPoint.Y); double start = pten1start.GetDistanceTo(pten2start); double end = pten1end.GetDistanceTo(pten2end); //这段代码主要解决相邻有多条等高线时选择距离最近的 if (startlength > start && endlength > end) { startlength = start; endlength = end; en2 = entemp; ele2 = ele; } else if (startlength > start) { startlength = start; endlength = end; en2 = entemp; ele2 = ele; } else if (endlength > end) { startlength = start; endlength = end; en2 = entemp; ele2 = ele; } } } else if (entemp is Polyline2d) { Polyline2d pl2d = entemp as Polyline2d; ele = Convert.ToDouble(pl2d.Elevation.ToString("f1")); if (ele == ele1 + eledvalue) { pten2start = new Point2d(pl2d.StartPoint.X, pl2d.StartPoint.Y); pten2end = new Point2d(pl2d.EndPoint.X, pl2d.EndPoint.Y); double start = pten1start.GetDistanceTo(pten2start); double end = pten1end.GetDistanceTo(pten2end); if (startlength > start && endlength > end) { startlength = start; endlength = end; en2 = entemp; ele2 = ele; } else if (startlength > start) { startlength = start; endlength = end; en2 = entemp; ele2 = ele; } else if (endlength > end) { startlength = start; endlength = end; en2 = entemp; ele2 = ele; } } } j++; if (j > plentitycollection.Count - 1) break; } //满足裁剪条件的节点 Point3dCollection cjcoll = new Point3dCollection(); bool flag = false; if (en2 != null) { //以计曲线节点为循环 for (int ii = 0; ii < pt3dcoll.Count; ii++) { Point3d pt3d = pt3dcoll[ii]; Point3d temppt3d = new Point3d(); temppt3d = GetClosestPoint(pt3d, en2); //临时计算两个3d点之间的平面距离 Point2d pt2d1 = new Point2d(pt3d.X, pt3d.Y); Point2d pt2d2 = new Point2d(temppt3d.X, temppt3d.Y); double length = pt2d1.GetDistanceTo(pt2d2); if (length < scalelen) { //flag为false标志继续添加满足条件节点 //flag为true标志结束添加节点,进行后续计算 if (ii == pt3dcoll.Count - 1)//最后一组节点 { flag = true; } else { cjcoll.Add(pt3d); cjcoll.Add(temppt3d); } } else { flag = true; } if (flag == true) { if (cjcoll.Count > 0) { if (cjcoll.Count > 3) { //矩形框四个角点 //选取2个为裁剪的两个节点 //为计曲线上的点 Point3d pt1cjnode = new Point3d(); Point3d pt2node = new Point3d(); Point3d pt3cjnode = new Point3d(); Point3d pt4node = new Point3d(); pt1cjnode = cjcoll[0]; pt2node = cjcoll[1]; pt3cjnode = cjcoll[cjcoll.Count - 2]; pt4node = cjcoll[cjcoll.Count - 1]; Point3dCollection rectcj = new Point3dCollection(); rectcj.Add(pt1cjnode); rectcj.Add(pt2node); rectcj.Add(pt3cjnode); rectcj.Add(pt4node); #region Point2d pt2djudge1 = new Point2d(pt1cjnode.X, pt1cjnode.Y); Point2d pt2djudge2 = new Point2d(pt3cjnode.X, pt3cjnode.Y); if (pt2djudge1.GetDistanceTo(pt2djudge2) > lenIgnore) { #region//画裁剪线 ////using (Transaction tran = doc.TransactionManager.StartTransaction()) ////{ //// //// 以只读方式打开块表记录 Open the Block table record for read //// BlockTable acbt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //// //// 以写方式打开模型空间块表记录 Open the Block table record Model space for write //// BlockTableRecord acblr = tran.GetObject(acbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //// //设置激活图层 //// layertable = tran.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; //// if (!layertable.Has("CJX")) //// { //// LayerTableRecord ltr = new LayerTableRecord(); //// ltr.Name = "CJX"; //// ObjectId layerid = layertable.Add(ltr); //// tran.AddNewlyCreatedDBObject(ltr, true); //// db.Clayer = layerid; //// } //// else //// { //// //设置首曲线为当期激活图层 //// foreach (ObjectId id in layertable) //// { //// LayerTableRecord lyrtbrec = tran.GetObject(id, OpenMode.ForWrite) as LayerTableRecord; //// if (lyrtbrec.Name == "CJX") //// db.Clayer = id; //// } //// } //// Polyline3d cjxpl = new Polyline3d(Poly3dType.SimplePoly, cjcoll, false); //// cjxpl.Color = GrxCAD.Colors.Color.FromColor(System.Drawing.Color.Blue); //// acblr.AppendEntity(cjxpl); //// cjxpl.Layer = "CJX"; //// tran.AddNewlyCreatedDBObject(cjxpl, true); //// //doc.Editor.WriteMessage(""); //// tran.Commit(); //// tran.Dispose(); ////} #endregion double Xmin = 9999999999, Xmax = 0, Ymin = 9999999999, Ymax = 0; //获取该点集的最大值最小值 foreach (Point3d pt3dcorner in cjcoll) { if (Xmin >= pt3dcorner.X) Xmin = pt3dcorner.X; if (Xmax < pt3dcorner.X) Xmax = pt3dcorner.X; if (Ymin >= pt3dcorner.Y) Ymin = pt3dcorner.Y; if (Ymax < pt3dcorner.Y) Ymax = pt3dcorner.Y; } if (Xmin > Xmax) { double tempt = 0; tempt = Xmin; Xmin = Xmax; Xmax = tempt; } if (Ymin > Ymax) { double tempt = 0; tempt = Ymin; Ymin = Ymax; Ymax = tempt; } #region//设置视图 //设置当前视图 ViewTableRecord viewtr = new ViewTableRecord(); viewtr.CenterPoint = new Point2d(Xmin + (Xmax - Xmin) / 2, Ymin + (Ymax - Ymin) / 2); viewtr.ViewDirection = new Vector3d(0, 0, 1); viewtr.Height = Ymax - Ymin + 100; viewtr.Width = Xmax - Xmin + 100; doc.Editor.SetCurrentView(viewtr); #endregion //对选择到的首曲线进行处理 string stttr = ""; TypedValue[] tvtemp = new TypedValue[1]; tvtemp.SetValue(new TypedValue((int)DxfCode.LayerName, sqxlayer), 0); SelectionFilter sftemp = new SelectionFilter(tvtemp); PromptSelectionResult psrtempt = doc.Editor.SelectCrossingWindow(new Point3d(Xmin, Ymin, 0), new Point3d(Xmax, Ymax, 0), sftemp); if (psrtempt.Status == PromptStatus.OK) { SelectionSet sstempt = psrtempt.Value; #region using (Transaction tran = doc.TransactionManager.StartTransaction()) { //// 以只读方式打开块表记录 Open the Block table record for read BlockTable acbt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //// 以写方式打开模型空间块表记录 Open the Block table record Model space for write BlockTableRecord acblr = tran.GetObject(acbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //设置激活图层 layertable = tran.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; //设置首曲线为当期激活图层 foreach (ObjectId id in layertable) { LayerTableRecord lyrtbrec = tran.GetObject(id, OpenMode.ForWrite) as LayerTableRecord; if (lyrtbrec.Name == sqxlayer) db.Clayer = id; } foreach (ObjectId oidtempt in sstempt.GetObjectIds()) { Entity entempt = tran.GetObject(oidtempt, OpenMode.ForWrite) as Entity; //if (ele1 > ele2) //{ // double tempt = 0; // tempt = ele1; // ele1 = ele2; // ele2 = tempt; //} if (entempt is Polyline) { Polyline pltempt = entempt as Polyline; if (Convert.ToDouble(pltempt.Elevation.ToString("f1")) > ele1 && Convert.ToDouble(pltempt.Elevation.ToString("f1")) < ele2) { //裁剪节点集 Point3dCollection pt3dcolltempt = new Point3dCollection(); //裁剪节点集 Point3dCollection pt3dcolltempt2 = new Point3dCollection(); //裁剪节点 Point3d pt3dtt1 = pltempt.GetClosestPointTo(pt1cjnode, false); Point3d pt3dtt2 = pltempt.GetClosestPointTo(pt3cjnode, false); //将线端点以外的点添加进裁剪接节点 if (pt3dtt1 != new Point3d()) { if (pt3dtt1 != pltempt.StartPoint && pt3dtt1 != pltempt.EndPoint) pt3dcolltempt.Add(pt3dtt1); } if (pt3dtt2 != new Point3d()) { if (pt3dtt2 != pltempt.StartPoint && pt3dtt2 != pltempt.EndPoint) pt3dcolltempt.Add(pt3dtt2); } stttr += pltempt.StartPoint.X + "," + pltempt.StartPoint.Y + "," + pltempt.StartPoint.Z + "!" + pltempt.EndPoint.X + "," + pltempt.EndPoint.Y + "," + pltempt.EndPoint.Z + "\r\n"; stttr += pt3dtt1.X + "@" + pt3dtt1.Y + "@" + pt3dtt1.Z + "!" + pt3dtt2.X + "@" + pt3dtt2.Y + "@" + pt3dtt2.Z + "\r\n"; if (pt3dcolltempt.Count > 0) { for (int ch = 0; ch < pt3dcolltempt.Count; ch++) { pt3dcolltempt2.Add(pt3dcolltempt[pt3dcolltempt.Count - 1 - ch]); } DBObjectCollection dbojcoll = null; DBObjectCollection dbojcoll2 = null; try { dbojcoll = pltempt.GetSplitCurves(pt3dcolltempt); } catch { } try { dbojcoll2 = pltempt.GetSplitCurves(pt3dcolltempt2); } catch { } if (dbojcoll2.Count > dbojcoll.Count) dbojcoll = dbojcoll2; //if (dbojcoll.Count >0) if (dbojcoll.Count < 1) continue; //{ if (pltempt.Closed)//如果该线闭合 { foreach (DBObject enen in dbojcoll) { Polyline plcjh = enen as Polyline; Point3dCollection ptcolltempt3d = new Point3dCollection(); plcjh.GetStretchPoints(ptcolltempt3d); Point3d ptptpt = ptcolltempt3d[(int)(ptcolltempt3d.Count / 2)]; //Point3d ptptpt = ptcolltempt3d[1]; Point2d ptinen1 = new Point2d(); Point2d ptinen2 = new Point2d(); //double llen = 9999; if (en1 is Polyline) { Polyline plen1 = en1 as Polyline; Point3d mypt = plen1.GetClosestPointTo(ptptpt, false); ptinen1 = new Point2d(mypt.X, mypt.Y); //llen = plen1.GetClosestPointTo(ptptpt, false).DistanceTo(ptptpt); } else if (en1 is Polyline2d) { Polyline2d pl2den1 = en1 as Polyline2d; Point3d mypt = pl2den1.GetClosestPointTo(ptptpt, false); ptinen1 = new Point2d(mypt.X, mypt.Y); //llen = pl2den1.GetClosestPointTo(ptptpt, false).DistanceTo(ptptpt); } if (en2 is Polyline) { Polyline plen2 = en2 as Polyline; Point3d mypt = plen2.GetClosestPointTo(ptptpt, false); ptinen2 = new Point2d(mypt.X, mypt.Y); } else if (en2 is Polyline2d) { Polyline2d pl2den2 = en2 as Polyline2d; Point3d mypt = pl2den2.GetClosestPointTo(ptptpt, false); ptinen2 = new Point2d(mypt.X, mypt.Y); } double llen = 9999; if ((ptinen1 != new Point2d()) && (ptinen2 != new Point2d())) { llen = ptinen1.GetDistanceTo(ptinen2); } if (llen < scalelen) { cdentity.Add(plcjh); } else { acblr.AppendEntity(plcjh); plcjh.Layer = sqxlayer; tran.AddNewlyCreatedDBObject(plcjh, true); } } } else { foreach (DBObject enen in dbojcoll) { Polyline plcjh = enen as Polyline; Point2d startpoint = new Point2d(plcjh.StartPoint.X, plcjh.StartPoint.Y); Point2d endpoint = new Point2d(plcjh.EndPoint.X, plcjh.EndPoint.Y); double linelength = startpoint.GetDistanceTo(endpoint); if (linelength > 1.5 * mapscale) { //if ((plcjh.GetClosestPointTo(pt3dtt1, false) == pt3dtt1) && (plcjh.GetClosestPointTo(pt3dtt2, false) == pt3dtt2)) if ((pt3dtt1 == plcjh.StartPoint || pt3dtt1 == plcjh.EndPoint) && (pt3dtt2 == plcjh.StartPoint || pt3dtt2 == plcjh.EndPoint)) { cdentity.Add(plcjh); } else { acblr.AppendEntity(plcjh); plcjh.Layer = sqxlayer; tran.AddNewlyCreatedDBObject(plcjh, true); } } else cdentity.Add(plcjh); } } //} entempt.Erase(true); //tran.Commit(); } } } else if (entempt is Polyline2d) { ////裁剪二维多段线代码 Polyline2d pl2dtempt = entempt as Polyline2d; if (Convert.ToDouble(pl2dtempt.Elevation.ToString("f1")) > ele1 && Convert.ToDouble(pl2dtempt.Elevation.ToString("f1")) < ele2) { Point3dCollection pt3dcolltempt = new Point3dCollection(); Point3d pt3dtt1 = pl2dtempt.GetClosestPointTo(pt1cjnode, false); Point3d pt3dtt2 = pl2dtempt.GetClosestPointTo(pt3cjnode, false); //将线端点以外的点添加进裁剪接节点 if (pt3dtt1 != new Point3d()) { if (pt3dtt1 != pl2dtempt.StartPoint && pt3dtt1 != pl2dtempt.EndPoint) pt3dcolltempt.Add(pt3dtt1); } if (pt3dtt2 != new Point3d()) { if (pt3dtt2 != pl2dtempt.StartPoint && pt3dtt2 != pl2dtempt.EndPoint) pt3dcolltempt.Add(pt3dtt2); } if (pt3dcolltempt.Count > 0) { Polyline pltempt = new Polyline(); Point3dCollection pt3dpl2dcoll = new Point3dCollection(); pl2dtempt.GetStretchPoints(pt3dpl2dcoll); //foreach (Point3d pt in pt3dpl2dcoll) //{ // pltempt.AddVertexAt(0,pt,0,0,0); //} DBObjectCollection dbojcoll = pl2dtempt.GetSplitCurves(pt3dcolltempt); if (dbojcoll.Count>0) { foreach (DBObject enen in dbojcoll) { Polyline2d pl2dcjh = enen as Polyline2d; Point2d startpoint = new Point2d(pl2dcjh.StartPoint.X, pl2dcjh.StartPoint.Y); Point2d endpoint = new Point2d(pl2dcjh.EndPoint.X, pl2dcjh.EndPoint.Y); double linelength = startpoint.GetDistanceTo(endpoint); if (linelength > 1.5 * mapscale) { if ((pl2dcjh.GetClosestPointTo(pt3dtt1, false) == pt3dtt1) && (pl2dcjh.GetClosestPointTo(pt3dtt2, false) == pt3dtt2)) if ((pt3dtt1 == pl2dcjh.StartPoint || pt3dtt1 == pl2dcjh.EndPoint) && (pt3dtt2 == pl2dcjh.StartPoint || pt3dtt2 == pl2dcjh.EndPoint)) { cdentity.Add(pl2dcjh); } else { acblr.AppendEntity(pl2dcjh); pl2dcjh.Layer = sqxlayer; tran.AddNewlyCreatedDBObject(pl2dcjh, true); } } else cdentity.Add(pl2dcjh); } } entempt.Erase(true); tran.Commit(); } } } #region//画裁剪线 //Polyline3d cjxpl = new Polyline3d(Poly3dType.SimplePoly, rectcj, false); //if (!layertable.Has("CJX")) //{ // LayerTableRecord ltr = new LayerTableRecord(); // ltr.Name = "CJX"; // ObjectId layerid = layertable.Add(ltr); // tran.AddNewlyCreatedDBObject(ltr, true); // //db.Clayer = layerid; //} //cjxpl.Color = GrxCAD.Colors.Color.FromColor(System.Drawing.Color.Blue); //acblr.AppendEntity(cjxpl); //cjxpl.Layer = "CJX"; //tran.AddNewlyCreatedDBObject(cjxpl, true); ////doc.Editor.WriteMessage(""); #endregion } tran.Commit(); tran.Dispose(); } #endregion } } } cjcoll.Clear(); cjcoll = new Point3dCollection(); } flag = false; continue; }//end if else { continue; } } } } } else return; #endregion #region ///画裁剪掉的线 if (cdentity.Count > 0) { using (Transaction tran = doc.TransactionManager.StartTransaction()) { //// 以只读方式打开块表记录 Open the Block table record for read BlockTable acbt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; //// 以写方式打开模型空间块表记录 Open the Block table record Model space for write BlockTableRecord acblr = tran.GetObject(acbt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //设置激活图层 layertable = tran.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; if (!layertable.Has("CJSQX")) { LayerTableRecord ltr = new LayerTableRecord(); ltr.Name = "CJSQX"; ObjectId layerid = layertable.Add(ltr); tran.AddNewlyCreatedDBObject(ltr, true); db.Clayer = layerid; } else { foreach (ObjectId id in layertable) { LayerTableRecord lyrtbrec = tran.GetObject(id, OpenMode.ForWrite) as LayerTableRecord; if (lyrtbrec.Name == "CJSQX") db.Clayer = id; } } foreach (Entity enenen in cdentity) { enenen.Color = GrxCAD.Colors.Color.FromColor(System.Drawing.Color.Red); acblr.AppendEntity(enenen); enenen.Layer = "CJSQX"; tran.AddNewlyCreatedDBObject(enenen, true); } doc.Editor.WriteMessage("已完成裁剪\r\n裁剪掉的等高线都放在CJSQX图层中\r\n"); tran.Commit(); tran.Dispose(); } } #endregion documentlock.Dispose(); doc.Editor.WriteMessage("程序运行结束"); } public static int CompareDGXByElevation(Entity en1, Entity en2) { double ele1 = 0, ele2 = 0; //because just Polyline and Polyline2d two class in plentitycollection if (en1 is Polyline) { Polyline pl = en1 as Polyline; ele1 = Convert.ToDouble(pl.Elevation.ToString("f1")); } else { Polyline2d pl2d = en1 as Polyline2d; ele1 = Convert.ToDouble(pl2d.Elevation.ToString("f1")); } if (en2 is Polyline) { Polyline pl = en2 as Polyline; ele2 = Convert.ToDouble(pl.Elevation.ToString("f1")); } else { Polyline2d pl2d = en2 as Polyline2d; ele2 = Convert.ToDouble(pl2d.Elevation.ToString("f1")); } return (int)(ele1 - ele2); } public static Point3d GetClosestPoint(Point3d pt, Entity enpl) { if (enpl is Polyline) { Polyline pl = enpl as Polyline; return pl.GetClosestPointTo(pt, true); } else { Polyline2d pl2d = enpl as Polyline2d; return pl2d.GetClosestPointTo(pt, true); } } #endregion } }